2015-01-03 68 views
1

在下面的代碼中,我試圖在運行代碼之後獲得非固定信號xspectrogram,我期望看到諸如發佈的日程「image_2」,頻率與時間表示之類的東西。但是發佈的代碼的結果是image_1如何獲得非平穩信號的正確頻譜圖?

可以任何一個請引導我得到正確的spectrogram

代碼

% Time specifications: 
Fs = 8000;      % samples per second 
dt = 1/Fs;      % seconds per sample 
    StopTime = 1;     % seconds 
    t = (0:dt:StopTime-dt);    % seconds 
t1 = (0:dt:.25); 
t2 = (.25:dt:.50); 
t3 = (.5:dt:.75); 
t4 = (.75:dt:1); 

%get a full-length example of each signal component 
x1 = (10)*sin(2*pi*100*t); 
x2 = (10)*sin(2*pi*200*t); 
x3 = (10)*sin(2*pi*300*t); 
x4 = (10)*sin(2*pi*400*t); 

    %construct a composite signal 
    x = zeros(size(t)); 
    I = find((t >= t1(1)) & (t <= t1(end))); 
    x(I) = x1(I); 
    I = find((t >= t2(1)) & (t <= t2(end))); 
    x(I) = x2(I); 
    I = find((t >= t3(1)) & (t <= t3(end))); 
    x(I) = x3(I); 
    I = find((t >= t4(1)) & (t <= t4(end))); 
    x(I) = x4(I); 

    NFFT = 2^nextpow2(length(t));  % Next power of 2 from length of y 
    Y = fft(x, NFFT); 
    f = Fs/2 * linspace(0, 1, NFFT/2 + 1); 
    figure; 
    plot(f(1:200), 2 * abs(Y(1:200))); 

    T = 0:.001:1; 
    spectrogram(x,10,9); 
    ylabel('Frequency'); 
    axis(get(gcf,'children'), [0, 1, 1, 100]); 

張貼代碼的結果:Spectrogram_Image_1enter image description here

什麼,我試圖讓:IMAGE_2: enter image description here

Update_1,圖像 代碼

%now call the spectrogram 
spectrogram(x, window, noverlap, Nfft, Fs); 
ylabel('Frequency'); 
axis(get(gcf,'children'), [0, 1]); 

enter image description here

回答

1

首先,與第一次你問我這個問題,你在時域繪製你的數據(即plot(t, x))並放大轉換以確保您的信號是您的想法?它是否有四個不同的時期,你打算有不同的頻率?

假設它確實如此,我很確定你的問題是你的spectrogram調用沒有做你想做的。我認爲你只能得到10的NFFT,這意味着你的箱子寬度爲800赫茲,這不足以解決你的頻率只有100赫茲。

在我看來,你應該指定更多的參數,以便你知道它在做什麼。你需要指定一個Nfft來提供你需要的頻率分辨率。一些分辨率高於100赫茲的設備(讓我們嘗試25赫茲),但不要求太多的點數,以致比頻率穩定的時間長(即小於0.25秒,這意味着小於2000點)。

要了解如何指定FFT的長度,我看了看文檔:http://www.mathworks.com/help/signal/ref/spectrogram.html

基礎上的文檔我想嘗試的五個參數版本:spectrogram(x,window,noverlap,nfft,fs)

對你的代碼,其中Fsx是因爲你已經定義了它們,頻譜通話將如下所示:

%define FFT parameters 
des_df_Hz = 25; %desired frequency resolution for the display, Hz 
Nfft = round(FS/des_df_Hz); %general rule for FFT resolution 
Nfft = 2*Nfft; %double the bins to account for spreading due to windowing 
Nfft = 2*round(0.5*Nfft); %make Nfft an even number 
window = Nfft; %make your window the same length as your FFT 
noverlap = round(0.95); %overlap a lot to make the plot pretty 

%now call the spectrogram 
spectrogram(x, window, noverlap, Nfft, Fs,'yaxis'); 
+0

比你的答案,這似乎是正確的,但軸NEDD進行調整。你能否告訴我如何正確調整軸?我希望水平軸是時間,垂直軸是頻率,帶有適當的採樣「引腳」。請參見上面發佈的update_1部分 – rmaik

+0

在matlab譜圖文檔(http://www.mathworks.com/help/signal/ref/spectrogram.html)中,其示例根據您的需要在垂直軸上顯示頻率。它說要將函數「yaxis」添加到函數調用中。我上面編輯了我的代碼。我還增加了重疊以使光譜圖看起來更平滑。 – chipaudette

+0

另外,你需要刪除你的'axis'命令,它會截斷y軸(很快就是「頻率」軸),從而只能從零到赫茲。那也是現在。一旦你對'spectrogram'調用進行了編輯,你會想用'ylim([0 1000]);''這樣簡單的東西替換你的'axis'命令。 – chipaudette

相關問題