【问题标题】:FFT Plot of an Audio Signal - MATLAB音频信号的 FFT 图 - MATLAB
【发布时间】:2015-07-28 22:06:27
【问题描述】:

我正在使用 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)));。我用log 替换了abs。它是否正确?

【问题讨论】:

  • 那我回答你的问题了吗?

标签: matlab plot signal-processing fft audio-processing


【解决方案1】:

在系数本身上应用log 没有任何意义......尤其是因为光谱本质上是复数值的。但是,有些人通常将log 应用于光谱的幅度(因此abs 调用)主要是出于可视化目的,因此幅度的大值不会压倒较小的值。在这种情况下应用log 将允许较大的值逐渐减小,并且可以更轻松地可视化光谱。但在我看来,直接使用log 是不正确的。您提供的代码绘制了单面光谱的大小,因此无需更改任何内容。

如果您提供了更多关于为什么要使用log 的见解,那会很有帮助,但现在,我想说直接的log 是不正确的。但是,如果您确实必须使用log,请将其应用于 ma​​gnitude。此外,为了防止未定义的行为,请确保在应用 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)|')  

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多