登录论坛

查看完整版本 : Matlab声音合成和滤波的问题【附代码-自己写的】


xmuer
2008-12-05, 11:41
我写了下面一段代码:实现读取'toilet.wav'(matlab附带的声音文件),然后给其加个noise1噪音,然后再设计一个滤波器进行滤波,把noise1滤除,可是实验的结果不是很理想,滤波后的声音出现了较大的失真。我不知道是自己程序写的有问题(尤其是欠采样那块儿及滤波器)还是过程参数选择的原因或者是方法错了,希望高人指教指教~~不甚感激。。。:lol:

%程序开始
clear
close all;

[Y,FS,NBITS]=WAVREAD('toilet.wav'); %读取声音信号
%sound(Y); %发音
SigLength=length(Y); %计算信号长度
t1=(0:SigLength-1)/FS;
subplot(3,3,1);plot(t1,Y);
xlabel('t1:时间');ylabel('Y(原音)');

F=fft(Y,SigLength); %进行fft变换
Pyy=Y.*conj(Y)/SigLength;
HalfLength=floor(SigLength/2);
f=FS*(0:HalfLength)/SigLength;
subplot(3,3,2);plot(f,Pyy(1:HalfLength+1));xlabel('频率(Hz)');

noise1=sin(2*pi*10*t1);
noise2=sin(2*pi*10000*t1); %暂时没用
noise1=noise1';
noise2=noise2';
Mixed=Y+noise1;
%sound(Mixed); %发出混合音
subplot(3,3,3);plot(t1,Mixed);
xlabel('t1:时间');ylabel('Mixed(混合音)');

F=fft(Mixed,SigLength); %进行fft变换
Pyy=Mixed.*conj(Mixed)/SigLength;
HalfLength=floor(SigLength/2);
f=FS*(0:HalfLength)/SigLength;
subplot(3,3,4);plot(f,Pyy(1:HalfLength+1));xlabel('频率(Hz)');

%对声音进行欠采样
Mixed_temp=Mixed(1:39662);
dfactor=3;
Mixed_dec=decimate(Mixed_temp,dfactor);
SigLength1=length(Mixed_dec); %计算信号长度
t2=(0:SigLength1-1)/FS;
%sound(Mixed_dec);
subplot(3,3,5);plot(t2,Mixed_dec);
xlabel('t2:时间');ylabel('Mixed_dec:(欠采样后的声音信号)');

%设计滤波器并滤波
N=8;
Fs=10000;
Wn=[40 1500]/(Fs/(dfactor*2));
[b,a]=butter(N,Wn);

Mixed_fil=filter(b,a,Mixed_dec);
Mixed_ok=interp(Mixed_fil,dfactor);
sound(Mixed_ok);
SigLength2=length(Mixed_ok); %计算信号长度
t3=(0:SigLength2-1)/Fs;
subplot(3,3,6);
plot(t3,Mixed_ok);
xlabel('t3:时间');ylabel('Mixed_ok:(滤波后的声音信号)');
grid;axis([0,4,-1,1])

SigLength3=length(Mixed_ok);
Y1= fft(Mixed_ok,SigLength3);
Pyy1= Y1.* conj(Y1) / SigLength3;
HalfLength1=floor(SigLength3/2);
f1=FS*(0:HalfLength1)/SigLength3;
subplot(3,3,7);
plot(f1,Pyy1(1:HalfLength1+1));xlabel('频率(Hz)'); %滤波后的频域波形
%程序结束

xmuer
2008-12-06, 10:44
没有人会么?:cry:

songzy41
2008-12-09, 20:46
把声音附上,可帮你看看。

xmuer
2008-12-10, 10:58
见附件:lol:

vivyzheng
2008-12-17, 08:58
fft变换那个地方是F.*conj(F)吧