给定图表的FFT(数据)

时间:2018-05-17 14:46:12

标签: matlab fft

我已经收集了一些声轴沿轴的压力分布数据,即Pressure_vs_distance,在特定的源频率(比如0.5 MHz)。现在,我想获得这些数据的频率成分(这将是n * 0.5 MHz),但是我尝试的每个代码,我都无法提取这些频率,而FFT图就像是零的垂直线。数据和图形如下。你能帮我看看有什么不对吗?

P.S:我自己的猜测是轴向数据的数量。但是,即使我增加它,结果也没有改变(fft图的形状)。

Pressure (MPa) _vs_axial distance (cm)

数据(大小~2 Mb):https://ufile.io/wjhlo

L=length(y);
dx=9.43479300064157e-05;
fs=1/dx;
out=fft(y,L)/L;
figure
plot(fs/2*linspace(0,1,(length(out)/2)+1),abs(out(1:(length(out)/2)+1))) 
title('One sided Spectrum')
xlabel('Normalized frequency')
ylabel('Magnitude')

2 个答案:

答案 0 :(得分:2)

从这个问题:

Confusion in figuring out the relation between actual frequency values and FFT plot indexes in MATLAB

[Ycomp, fHz] = getFFT(y(1:1000),1/(x(2)-x(1)))

enter image description here

您的采样频率似乎是10.6KHz。因此,根据奈奎斯特香农采样定理,您将无法检测到5.3 KHz以上的频率。不确定0.5 MHz的来源。

答案 1 :(得分:1)

首先准备您的数据:尝试通过预加重滤镜传递您的数据:

is-active

接下来,观察您的数据并删除明显的数据错误:

y1 = filter([1 -1], 1, y);

傅立叶分析仅适用于准周期信号。因此,您应该选择准平稳性的间隔,并对这种(可能的重叠)间隔进行分析。假设信号在5000点上是准静态的。我们希望通过100点转换进行分析:

y1(1:3) = 0;

让我们显示所有结果:

sampleRate = 1/(x(2)-x(1));
frameSize = 5000;
frameShift = 100;
[signalSpectrogram, freqObs, timeObs] = spectrogram(y1, frameSize, frameSize-frameShift, pow2(nextpow2(frameSize)), sampleRate);

最后你必须得到类似的东西: spectrogram