数字信号处理中求频谱图与滤除噪声的问题

来源:互联网 发布:项目管控软件 编辑:程序博客网 时间:2024/05/21 06:12


对语音信号添加噪声并滤除噪声,但是比较不好的是滤完噪声后声音也变低沉了。

要注意的两点:

1.关于频谱图的绘制问题,这里用的格式是:

X=fft(x);
t1=(0:length(x)-1)*fs/length(x)-fs/2;
plot(t1,fftshift(abs(X)));
2.关于低通滤波器的设计和添加噪声的问题要熟练。

由于信号是被fs采样得到的,不能直接plot(X),或者直接求其幅度谱(都不能说明问题)
错误代码1:
[x,fs,bits]=wavread('009.wav');
%sound(x,fs,bits);
X=fft(x);
magX=abs(X);
figure(1);
subplot(2,1,1);
plot(x);title('原始语音信号时域波形');
subplot(2,1,2);
plot(magX);title('原始语音信号的频谱');

其实并不能称为频谱,只能称为幅度谱,且采样之后的周期延拓很明显。


错误代码2:
[x,fs,bits]=wavread('009.wav');
%sound(x,fs,bits);
X=fft(x);
figure(1);
subplot(2,1,1);
plot(x);title('原始语音信号时域波形');
subplot(2,1,2);
plot(X);title('原始语音信号的频谱');

这种直接求得fft的频谱,还不明白为什么会这样。


正确代码:
[x,fs,bits]=wavread('009.wav');
%sound(x,fs,bits);
X=fft(x);
t1=(0:length(x)-1)*fs/length(x)-fs/2;
figure(1);
subplot(2,1,1);
plot(x);
axis([0,400000,-2,2]);
title('原始语音信号时域波形');
subplot(2,1,2);
plot(t1,fftshift(abs(X)));title('原始语音信号的频谱');

%添加噪声
N=length(x);
noise=0.3*randn(size(x));
x1=x+noise;
X1=fft(x1);
t2=(0:length(x1)-1)*fs/length(x1)-fs/2;
%sound(x1,fs,bits);
figure(2);
subplot(2,1,1);
plot(x1);title('加噪语音信号时域波形');
subplot(2,1,2);
plot(t2,fftshift(abs(X1)));title('加噪语音信号的频谱');

%低通滤波
Wp=500/(fs/2);Ws=1000/(fs/2);Rp=1; Rs=10;
[N,Wn]= Buttord(Wp,Ws,Rp,Rs) ;
[B,A]=Butter(N,Wn,'low');
m0=filtfilt(B,A,x1);
mx=fft(m0);
t3=(0:length(m0)-1)*fs/length(m0)-fs/2;
%sound(m0,fs,bits);
figure(3);
subplot(2,1,1);
plot(m0);title('低通滤波后的信号');
subplot(2,1,2);
plot(t3,fftshift(abs(mx)));title('低通滤波后的频谱');

这个才是正确的频谱。

1 0
原创粉丝点击