Matlab 给定图表(数据)的FFT

Matlab 给定图表(数据)的FFT,matlab,fft,Matlab,Fft,我收集了一些关于特定源频率(比如0.5MHz)下声场沿轴的压力分布的数据,即压力与距离。现在,我想获得这些数据的频率成分(将是n*0.5MHz),但是我尝试的每一个代码,我都无法提取这些频率,FFT图就像是零处的垂直线。数据和数字如下所示。你能帮我看看出了什么问题吗 我自己的猜测是轴向数据的数量。但是,即使我增加它,结果也没有改变(fft图的形状) 数据(大小约2 Mb): 从这个问题: 您的采样频率似乎是10.6KHz。因此,根据奈奎斯特-香农采样定理,你不会检测到高于5.3 KHz的频

我收集了一些关于特定源频率(比如0.5MHz)下声场沿轴的压力分布的数据,即压力与距离。现在,我想获得这些数据的频率成分(将是n*0.5MHz),但是我尝试的每一个代码,我都无法提取这些频率,FFT图就像是零处的垂直线。数据和数字如下所示。你能帮我看看出了什么问题吗

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

数据(大小约2 Mb):

从这个问题:

您的采样频率似乎是10.6KHz。因此,根据奈奎斯特-香农采样定理,你不会检测到高于5.3 KHz的频率。不确定您的0.5 MHz来自何处。

来自此问题:


您的采样频率似乎是10.6KHz。因此,根据奈奎斯特-香农采样定理,你不会检测到高于5.3 KHz的频率。不确定0.5 MHz来自何处。

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

y1 = filter([1 -1], 1, y);
接下来,观察数据并删除明显的数据错误:

y1(1:3) = 0;
傅里叶分析仅适用于准周期信号。因此,您应该选择一个准平稳的区间,并对这些(可能重叠的)区间进行分析。假设信号在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');
最后,你必须得到类似的东西:

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

y1 = filter([1 -1], 1, y);
接下来,观察数据并删除明显的数据错误:

y1(1:3) = 0;
傅里叶分析仅适用于准周期信号。因此,您应该选择一个准平稳的区间,并对这些(可能重叠的)区间进行分析。假设信号在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');
最后,你必须得到类似的东西:

这是因为第0个频率比任何其他频率都强得多。第0个频率是直流分量。减去直流分量(
y-mean(y)
)或删除第0个频率分量(
out(1)=0
)将允许您以预期的方式查看绘图。感谢您的回复。我试过了,但没用。不完全是,而且只在零度。如果你可以自己测试数据,那将非常有用。然后更改y限制:
set(gca,'ylim',[0,10])
,替换
10
,直到你看到你想要看到的。或者使用对数lin图:
set(gca,'yscale','log')
。问题是我看不到预期频率下的峰值,0.5*n MHz(n=1,2,…)(x轴)。实际上,在高频(y=0@f>20hz)下它是一条平坦的线,这是因为第0个频率比任何其他频率都强得多。第0个频率是直流分量。减去直流分量(
y-mean(y)
)或删除第0个频率分量(
out(1)=0
)将允许您以预期的方式查看绘图。感谢您的回复。我试过了,但没用。不完全是,而且只在零度。如果你可以自己测试数据,那将非常有用。然后更改y限制:
set(gca,'ylim',[0,10])
,替换
10
,直到你看到你想要看到的。或者使用对数lin图:
set(gca,'yscale','log')
。问题是我看不到预期频率下的峰值,0.5*n MHz(n=1,2,…)(x轴)。事实上,这是一条高频(y=0@f>20Hz)的扁平线非常感谢你非常感谢你非常感谢Andrei,我不知道为什么我不能对你的答案投票:非常感谢Andrei,我不知道为什么我不能对你的答案投票:s