Plot 在倍频程上绘制FFT

Plot 在倍频程上绘制FFT,plot,signal-processing,fft,octave,Plot,Signal Processing,Fft,Octave,我知道FFT将时域中的函数转换为频域中的函数 然而,当我尝试在频域中绘制所述图形时,我只能通过使用时间作为X轴使其正常工作,而显然,时间不是X轴,而是频率 此外,我只能通过将y轴除以某个整数来获得振幅,以匹配原始信号中的振幅。为什么呢 这是我的密码 t=0:0.001:2 x=2*sin(20*pi*t) + sin(100*pi*t) subplot(2,1,1) plot(1000*t,x) grid xlabel("Time in milliseconds") ylabel("Signa

我知道FFT将时域中的函数转换为频域中的函数

然而,当我尝试在频域中绘制所述图形时,我只能通过使用时间作为X轴使其正常工作,而显然,时间不是X轴,而是频率

此外,我只能通过将y轴除以某个整数来获得振幅,以匹配原始信号中的振幅。为什么呢

这是我的密码

t=0:0.001:2

x=2*sin(20*pi*t) + sin(100*pi*t)
subplot(2,1,1)
plot(1000*t,x)
grid
xlabel("Time in milliseconds")
ylabel("Signal amplitude")

subplot(2,1,2)
y=fft(x)
plot(1000*t,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")
和图表

请帮助=(

频率关系(x轴缩放) 直至奈奎斯特频率(采样率的一半),FFT产生的每个值的频率通过以下方式与输出值的指数线性相关:

f(i) = (i-1)*sampling_frequency/N
其中N是FFT点数(即
N=length(y)
)。在您的例子中,
N=2001
。在奈奎斯特频率上方,频谱显示围绕负频率分量(来自频谱的周期性扩展)

您可以将
t
的定义中的采样频率减去1/t,其中t是采样时间间隔(在您的情况下,t=0.001)。 因此,采样频率为1000Hz

注意,由于
t(i)
的值也与索引
i
线性相关,因此

t(i) = (i-1)*0.001
可以定义
f=1000*t*sampling\u frequency/N
,但不建议这样做,因为这会模糊您的代码。 请注意,您缺少
采样频率/N
项,这相应地导致音调以错误的频率显示 (根据
x
的定义,在10Hz和50Hz处应该有峰值,在-10Hz和-50Hz处应该有对应的别名,缠绕后在990Hz和950Hz处显示)

振幅关系(y轴缩放) 请注意,观察到的关系只是近似的,因此以下不是数学证明,而只是直观地显示时域音调振幅和频域峰值之间的关系

将问题简化为单音:

x = A*sin(2*pi*f*t)
相应峰值的近似振幅可通过以下公式得出:

在时域(方程左侧),表达式大约等于
0.5*N*(A^2)

在频域(方程式右侧),做出以下假设:

  • 微不足道
  • 音调的光谱内容仅包含在2个单元中(频率
    f
    ,对应的混叠频率
    -f
    )用于求和(所有其他单元均为~0)。请注意,这通常仅在音调频率是采样频率/N的精确(或接近精确)倍数时成立
对于与频率
f
处峰值相对应的
k
的某些值,右侧的表达式大约等于
2*(1/N)*abs(X(k))^2

将这两个参数组合在一起,可以得到abs(X(k))~0.5*A*N。换句话说,输出振幅相对于时域振幅的比例因子为
0.5*N
(在您的情况下约为1000),正如您所观察到的


这个想法仍然适用于多个音调(尽管可忽略的频谱泄漏假设最终被打破)。

其他答案表明,在这个例子中,950Hz和990Hz处存在频率响应。这是对FFT代码如何使用索引的误解。这些“高频”尖峰实际上是-50Hz和-10Hz

频域从-N/2*采样频率/N扩展到+N/2*采样频率/N。但出于历史原因,惯例是前N/2条信息为正频率,中点为零频率,最后N/2条信息为负频率,顺序相反。对于功率spectrum,不需要显示超过前1+N/2条的信息

这个惯例非常令人困惑,因为我不得不从Press等人的数字配方和手工编码快速Hartley变换中弄清楚,很多年前,当我第一次使用FFT时,早在Cleve Moler发给一些幸运的博士生的Matlab 1.0的beta测试版之前:-)

你好(这篇文章很旧,但对未来的访问者可能有用)

要完成并说明其他答案,此代码受Matlab文档启发,适用于倍频程:

通过将频率轴定义为SleuthEye精确的频率轴,我们得到了预期的50Hz和120Hz的音调(以及它们的负别名)

Fs = 1000;
Ts = 1/Fs;
L = 1500;
t = (0:L-1)*Ts;

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t));

figure(1)
plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

Y = fft(X);

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;

figure(2)
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

f2 = Fs*(0:(L-1))/L;

figure(3)
plot(f2,P2) 
title('Two-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P2(f)|')