2014-11-06 51 views
0

我有一個​​的加速度數據和它的時間矢量。我確定了高於閾值的峯值,現在我應該爲每個峯值找到FFT。 作爲結果,我有這樣的:如何確定峯寬並對每個峯進行FFT(並將其繪製在單獨的圖中)

Peak Value 1 = 458, index 1988 

Peak Value 2 = 456, index 1990 

Peak Value 3 = 450, index 12081 

....

Peak Value 9 = 432, index 12151 

要找到這些山峯我用peakfinder腳本。 命令[peakLoc,peakMag] = peakfinder(x0,...)給出了峯值的位置和大小。 此外,我有每個峯值的時間(從時間數據向量)。

所以我想,我應該採取每個峯值,找到其寬度(或峯值附近的一些數據點),並使FFT。我對嗎?你能幫我嗎? 我在八度工作,我是新來的:)

代碼:

load ("C:\\..patch..\\peakfinder.m"); 
d =dlmread("C:\\..patch..\\acc2.csv", ";"); 
T=d(:,1); 
Ax=d(:,2);  
[peakInd peakVal]=peakfinder(Ax,10,430,1);  
peakTime=T(peakInd);  
[sortVal sortInd] = sort(peakVal, 'descend');  
originInd = peakInd(sortInd);  
for k = 1 : length(sortVal)  
fprintf(1, 'Peak #%d = %d, index%d\n', k, sortVal(k), originInd (k));  
end  
plot(T,Ax,'b-',T(peakInd),Ax(peakInd),'rv'); 

,在這裏你可以下載數據http://www.filedropper.com/acc2

FFT

d =dlmread("C:\\..path..\\acc2.csv", ";"); 
T=d(:,1); 
Ax=d(:,2); 

% sampling frequency 
Fs_a=2000; 

% length of FFT 
Length_Ax=numel(Ax); 

% number of lines of Fourier spectrum 
fft_L= Fs_a*2; 

% an array of time samples 
T_Ax=0:1/Fs_a: Length_Ax; 

fft_Ax=abs(fft(Ax,fft_L)); 

fft_Ax=2*fft_Ax./fft_L; 

F=0:Fs_a/fft_L:Fs_a/2-1/fft_L; 

subplot(3,1,1); 
plot(T,Ax); 
title('Ax axis'); 
xlabel('time (s)'); 
ylabel('amplitude)'); grid on; 

subplot(3,1,2); 
plot(F,fft_Ax(1:length(F))); 
title('spectrum max Ax axis'); 
xlabel('frequency (Hz)'); 
ylabel('amplitude'); grid on; 
+0

這沒有意義至我:你不能接受一個峯值的FFT?以整個加速度數據樣本的FFT爲準,但這與峯值無關。 – am304 2014-11-06 11:55:39

+0

另外,我不知道你從哪裏得到你的'peakfinder'函數。我有Octave 3.8,而且就我所見,它不在那裏。 – am304 2014-11-06 11:56:42

+0

@ am304我有相同的Octave,但是我沒有函數findpeaks,因爲目前我在使用此函數安裝包時遇到問題。所以我只是加載了峯峯腳本。 – Alisa 2014-11-06 12:08:12

回答

0

它看起來就像你有兩組峯一樣,所以我會將這些數據繪製在三個圖上:整個時間序列中的一個,一個放大第一個簇,最後一個放大o n向第集羣(注意我已經1e6,除以所有時間值,否則刻度標記變得醜陋):

figure 
subplot(3,1,1)  
plot(T/1e6,Ax,'b-',peakTime/1e6,peakVal,'rv'); 
subplot(3,1,2) 
plot(T/1e6,Ax,'b-',peakTime(1:4)/1e6,peakVal(1:4),'rv'); 
axis([0.99*peakTime(1)/1e6 1.01*peakTime(4)/1e6 0.9*peakVal(1) 1.1*peakVal(4)]) 
subplot(3,1,3) 
plot(T/1e6,Ax,'b-',peakTime(5:end)/1e6,peakVal(5:end),'rv'); 
axis([0.995*peakTime(5)/1e6 1.005*peakTime(end)/1e6 0.9*peakVal(5) 1.1*peakVal(end)]) 

我已經設置圍繞着極大的時間和加速度值的軸,使用一些係數有一些「填充「(通過反覆試驗獲得這些係數的值)。這給了我下面的情節,希望這是你之後的事情。如果您願意,您可以添加x和y標籤。

enter image description here

編輯

這是我會怎麼做的FFT:

Fs = 2000; 
L = length(Ax); 
NFFT = 2^nextpow2(L); % Next power of 2 from length of Ax 
Ax_FFT = fft(Ax,NFFT)/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 

% Plot single-sided amplitude spectrum. 
figure 
semilogx(f,2*abs(Ax_FFT(1:NFFT/2+1))) % using semilogx as huge DC component 
title('Single-Sided Amplitude Spectrum of Ax') 
xlabel('Frequency (Hz)') 
ylabel('|Ax(f)|') 
ylim([0 300]) 

給出以下結果:

enter image description here

相關問題