如何从双边频谱绘制单边频谱?
How to plot a one-sided spectrum from a two-sided spectrum?
我的代码中有一个 wav 文件。我对我的音频信号使用了 FFT 来进行 STFT。基本上我正在做的是 "real-time spectral analysis"。我从信号中得到的是双边频谱。
此处提供的代码,可以帮助您理解我的意思。我建议你试试看。只需将任何 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))));
我的代码中有一个 wav 文件。我对我的音频信号使用了 FFT 来进行 STFT。基本上我正在做的是 "real-time spectral analysis"。我从信号中得到的是双边频谱。
此处提供的代码,可以帮助您理解我的意思。我建议你试试看。只需将任何 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))));