如何确定峰的宽度并为每个峰进行FFT(并在单独的图中绘制)

时间:2014-11-06 10:36:36

标签: fft octave

我有X-axis的加速度数据和时间向量。我确定峰值超过阈值,现在我应该找到每个峰值的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。我对吗?你可以帮助我吗? 我在Octave工作,我在这里新人:)

代码:

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;

1 个答案:

答案 0 :(得分:0)

看起来你有两个峰值簇,所以我会将数据绘制成三个图:一个是整个时间序列,一个放大了第一个簇,另一个放大了第二个簇(注意我已将所有时间值除以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