我使用MATLAB使用FFT绘制录制的声音。我想采用y轴的log
但我不知道如果正确我做了什么。
目前,我的FFT绘图代码如下所示:
nf=1024; %number of point in DTFT
Y = fft(y,nf);
f = fs/2*linspace(0,1,nf/2+1);
plot(f,abs(Y(1:nf/2+1)));
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
我所做的是:plot(f,log(Y(1:nf/2+1)));
。我将abs
替换为log
。它是否正确?
答案 0 :(得分:1)
对系数本身应用log
没有任何意义......特别是因为光谱本质上是复数值的。但是,有些人通常将log
应用于光谱的幅度(因此abs
调用)主要用于可视化目的,因此大幅度的值不会超过较小的值。在这种情况下应用log
将允许更大的值逐渐减小,并且可以更容易地显示光谱。但在我看来应用直线log
是不正确的。您提供的代码绘制了单面光谱的大小,因此无需更改任何内容。
如果您提供了关于为什么的更多信息,您希望使用log
,这会有所帮助但是现在,我会说直线log
不正确。但是,如果您真的必须使用log
,请将其应用于幅度。另外,为了防止未定义的行为,请确保在应用log
之前将幅度加1,以便将您的幅度的零值映射到零,而不是未定义。
因此,请改为:
nf=1024; %number of point in DTFT
Y = fft(y,nf);
f = fs/2*linspace(0,1,nf/2+1);
plot(f,log(1 + abs(Y(1:nf/2+1)))); %// Change
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')