给定图表(数据)的 FFT

FFT of a given diagram (data)

我收集了一些声场沿轴的压力分布数据,即 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')

来自这个问题:

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)))

你的采样频率好像是10.6KHz。因此,根据奈奎斯特香农采样定理,您不会检测到 5.3 KHz 以上的频率。不确定您的 0.5 MHz 是从哪里来的。

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

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

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

y1(1:3) = 0;

傅里叶分析仅适用于准周期信号。因此,您应该 select 一个准平稳区间,并对此类(可能重叠的)区间进行分析。假设信号在 5000 点上是准平稳的。我们要进行 100 点偏移的分析:

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

让我们显示所有结果:

figure('NumberTitle','off', 'Name','The Spectral Analysis', 'Units','normalized', 'Position',[0 0 1 1]);

subplot(3,1,1);
plot(x,y);
grid('on');
xLim = xlim();
title('Original Signal');

subplot(3,1,2);
plot(x,y1);
grid('on');
title('Prepared Signal');

subplot(3,1,3);
imagesc(timeObs, freqObs, 10*log10(signalSpectrogram.*conj(signalSpectrogram)));
axis('xy');
axis([xLim 0 200]);
title('Prepared Signal Spectrogram');

最后你一定会得到类似这样的东西: