2014-07-24 100 views
2

我正試圖從.wav文件中獲取信號特定部分的快速傅里葉變換。.WAV文件上的FFT

.wav文件是每0.6秒重複一次信號。

我想弄清楚如何得到重複10次,並比較以表明結果應該是相似的。

這是代碼,我現在:

Fs = 44100; 
cj = sqrt(-1); 

[test,fs]= wavread('3b healthy2.wav'); % File data name 


dt = 1/Fs; 
time = 45.6; 
N = time/dt; 

left=test(:,1); 
right=test(:,2); 


I = left; 
Q = right; 

t = 0:dt:(time-dt); 

n = length(t); 

f = -Fs/2:Fs/n:Fs/2-Fs/n; 

s = I+cj.*Q; 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Smooth the signal 
ss = smooth(s,201); 

sf = fftshift(fft(ss(1:N))); % taking fft 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

figure(2) 

plot(f,(abs(sf))./max(abs(sf))) 

所以一旦我獨立的程序,我可以找出時間域,並從那裏我發現有一個重複是在45.2至45.8。

我運行這個程序後,我得到一個圖形,但是從我所看到的,它不包括重複一次,但所有的重複組合高達45.2

編輯

下面的圖是什麼信號看起來像是45秒。信號連續重複3分鐘。現在我需要的是45秒重複的FFT

signal

+0

我不完全理解你的問題。您是否問過如何截斷輸入信號,時間只有45s到46s?如果是這樣,那不應該太難做。 –

+0

是的,但我需要特定時間的fft。我需要得到多個地方的ffthift(fft),然後比較它們。所以我想知道我的代碼在哪裏有錯誤,一旦我把我的時間設置爲45,就是結合了fft,而不是在45s給我fft。希望有道理 – fragkos

回答

0

它看起來像你想設置爲要分析你的信號的窗口。

如果是這樣,在時間域中,你只需截斷你的向量。

left=test(:,1); 
right=test(:,2); 
time = 45; 
interval =1; // per second, for 0.1 second use interval = 0.1; 
w_range = time*Fs: (time+interval)*Fs-1; 
I = left(w_range) // truncate here 
Q = right(w_range) // and here 
n = interval * Fs; 
f = -Fs/2:Fs/n:Fs/2-Fs/n; 
// continue FFT analysis ... 

有意義嗎?如果這不是你想要的,請留下評論。

+0

看起來像它的罰款,但我如何將它添加到代碼?我的意思是我需要改變這部分的哪個變量,如果我需要45.1秒的fft?欣賞它 – fragkos

+0

我嘗試把間隔設爲1,然後給我一個很好的圖。一旦我改變間隔爲45,然後我得到這個錯誤:索引超過矩陣的尺寸。 tryalfft2錯誤(第17行) I = left(w_range); %截斷這裏 – fragkos

+0

公頃,我忘了把'interval'的值。對於那個很抱歉。代碼已更新。間隔是你的窗口寬度。單位是秒,所以45表示距離開始時間45秒。你必須確保索引不會超過矩陣的尺寸。我建議你在Matlab中閱讀更多關於[數組索引](http://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html)。 –