matlab - 如何从双面频谱绘制出单边频谱?

标签 matlab audio fft octave spectrum

我的代码中有一个wav文件。我在音频信号上使用了FFT来进行STFT。基本上我正在做的是“实时频谱分析”​​。我从信号中得到的是双向频谱。

这里提供的代码可以帮助您理解我的意思。我建议您尝试一下。只需提取任何wav文件并将其放在Matlab / Octave目录中即可。变量Yres包含两侧频谱。

任何想法,如何使它单面?我敢肯定,这很简单,我很想念。

[y,fs]=wavread('UnchainMyHeart.wav');
t=linspace(0,length(y)/fs,length(y));
plot(t,y)

%Plotting my signal in the time domain
fftlen = 4096; 
segl =floor(0.05*fs); 
windowshift=segl/2; 
window=hann(segl); 
window=window.'; 

si=1; 
ei=segl; 
AOS= length(y)/windowshift - 1;
f1=figure;
f=0:1:fftlen-1;
f=f/(fftlen-1)*fs;

Ya=zeros(1,fftlen);
plot(f,Ya),axis([0 fs -90 20])
grid on 

n=0;
for m = 1:1:AOS
  y_a = y(si:ei);
  y_a= y_a.*window;
  Ya=fft(y_a, fftlen);
  n=n+1;
  if n==1
    Yres=abs(Ya);
  else
    Yres=Yres+abs(Ya);
  end

  if n=10
    Yres=Yres/10;
    n=0;
    drawnow; 
    figure(f1);
    plot(f, 20*log10(abs(Yres)));
    ylim([-90 20]);
    title("Spectrum of a audio signal");
    xlabel("f(Hz)");
    ylabel("dB");
    grid on;
  end

  si=si+windowshift;   
  ei=ei+windowshift; 
end     

最佳答案

您可以绘制已经拥有的频谱的一半:

plot(f(1:end/2), 20*log10(abs(Yres(1:end/2))));

或者,您也可以选择完整但集中的内容:
plot(fftshift(f), 20*log10(abs(fftshift(Yres))));

关于matlab - 如何从双面频谱绘制出单边频谱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291508/

相关文章:

matlab - 在 MATLAB 中查找二维脉冲峰值

android - 音频在Android Webview中不起作用

javascript - 使Soundcloud播放列表在重新加载时继续播放

c++ - 前向 FFT 图像和后向 FFT 图像以获得相同的结果

c# - 简单的就地离散傅立叶变换 (DFT)

matlab - block 矩阵创建

matlab - 将向量分成预定义大小的组

matlab - 是什么原因导致错误 "Row ' c140 8' infeasible, all entries at implied bounds."?我怎样才能在matlab中显示它?

audio - 合并 mp3 文件的最佳方法是什么?

c++ - 为什么理想带通滤波器不能按预期工作?