如何从两侧光谱绘制一侧光谱?

Posted

技术标签:

【中文标题】如何从两侧光谱绘制一侧光谱?【英文标题】:How to plot a one-sided spectrum from a two-sided spectrum? 【发布时间】:2016-10-27 18:12:21 【问题描述】:

我的代码中有一个 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     

【问题讨论】:

【参考方案1】:

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

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

或者您也可以选择完整的但居中:

plot(fftshift(f), 20*log10(abs(fftshift(Yres))));

【讨论】:

以上是关于如何从两侧光谱绘制一侧光谱?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 RGB 中的可见光谱?

如何检测光谱中的发射线?

用 C++ 绘制图像的光谱(fftw,OpenCV)

在 hyperSpec 对象中绘制具有不同颜色的多个光谱

nls 当数据是卷积光谱时(变量数量可变)

如何读取 IRAF 多光谱光谱?