数字信号处理课设,我们使用MATLAB对语音信号进行了一系列处理,并将其所有功能集中于下图界面中:
这个界面涉及功能众多,其中包括语音信号的观察分析、音色变换、AM调制解调、减抽样、加噪去噪、相频分析和幅频滤波等,最重要的是对MATLAB中函数的掌握,通过不同函数的组合实现你想要实现的功能。
本篇不会给出整个界面的程序,下面会分块给出每个功能的程序,整个界面只需GUI设计界面文件、定义结构体并把对应键程序打进去即可。
1、语音信号的采集
1.1题目要求
使用windows下的录音机录制一段语音信号、音乐信号或者采用其他软件截取一段音乐信号(要求:时间不超过5s,文件格式为WAV。)
① 请每位同学都参与录音,内容自定。
② 使用wavread语句读取语音/音乐信号获取抽样率;(注意:读取的信号是双声道信号,即为双列向量,需要分列处理);
③ 输出时域语音/音乐信号的波形。
④ 实现对录音信号的声音大小的调节。
⑤ 实现对两种语音/音乐信号的混音音效。
⑥ 实现音乐信号的回音音效。
1.2设计内容及方案
① 读取音频信号:我是通过wavread函数读取.wav文件的方式来获得,当然首先要自己创建一个.wav音频,我是通过电脑录音生成.mp3然后格式工厂转成.wav的,需保存到同一文件夹下。
② 分声道处理:一般音乐和语音信号都是双声道信号,时域和频谱图会有两个颜色,所以要取单列来分析,通过x1=x(:,1)语句来实现。
③ 画时域波形图:用plot函数来画图,注意横坐标为时间t。
④ 音量大小调节:通过将音频直接乘一个系数来实现调音量。
⑤ 混音和回声:混音即将两个音频相加,要相加就得保证矩阵一样,所以要通过截取并补零矩阵来实现;回声是把三个信号叠加,这三个信号在不同位置补零音量也逐渐变小,就可以实现回声。
⑥ 播放声音:本题我使用wavplay来播放声音,会有警告,后面的题我用sound比较好。
1.3程序源码及注释
clear [x,fs] = wavread(\'beautiful.wav\');%音乐信号 [y,fs1]= wavread(\'1.wav\');%女生声音 [z,fs2]= wavread(\'2.wav\');%男生声音 %输出频率 fs fs1 fs2 %音乐语音信号分声道处理 x1=x(:,1); y1=y(:,1); z1=z(:,1); %画音乐信号时域图 n1=length(x1);%length取数列长度即元素个数 figure(1) t1=(0:(n1-1))/fs; plot(t1,x1); axis([0,5,-1,1]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'音乐信号时域波形\'); %画语音信号时域图 n2=length(y1); figure(2) subplot(2,1,1); t2=(0:(n2-1))/fs1; plot(t2,y1);%女生 axis([0,4,-0.5,0.5]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'女生语音信号时域波形\'); n3=length(z1); subplot(2,1,2); t3=(0:(n3-1))/fs2; plot(t3,z1);%男生 axis([0,4,-0.5,0.5]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'男生语音信号时域波形\'); %对语音信号声音大小调节 wavplay(y,fs1); %播放原语音 y11=10*y; wavplay(y11,fs1); %加大音量播放 y22=0.5*y; wavplay(y22,fs1); %减小音量播放 %两种语音信号的混音 [m,n]=size(y1);%size取矩阵的行列数 [m0,n0]=size(z1); a=zeros(abs(m-m0),n);%两矩阵行数差为零矩阵行数 if length(y1)<length(z1) y2=[y1;a]; y3=y2+z1;%两个矩阵行数一样才能相加,所以要补零 else y2=[z1;a]; y3=y2+y1;%y1和z1中长的那个不变,短的那个补零 end; wavplay(y3,fs1) ;%播放混音语音 %画混音波形 figure(3) subplot(2,1,1); t4=(0:(max(n2,n3)-1))/fs1; plot(t4,y3); axis([0,4.5,-0.5,0.5]); xlabel(\'时间\'); ylabel(\'幅度\'); title(\'两语音信号叠加后时域波形\'); %音乐信号的回音 x11=x1(1:200000);%截取部分 x11=x11\';%因为输出为一列所以要转置成一行 int0=zeros(1,20000);%1行2000列的零矩阵 temp1=[x11,int0,int0]; temp2=[int0,0.6*x11,int0]; temp3=[int0,int0,0.3*x11];%通过补零实现延时,同时声音一个比一个小 hui=temp1+temp2+temp3;%三重声音相加实现回声 N=length(hui); wavplay(hui,fs1);%播放回音音乐 %画回声波形 subplot(2,1,2); t1=(0:(N-1))/fs; plot(t1,hui); axis([0,4.5,-1,1]); xlabel(\'时间\'); ylabel(\'幅度\'); title(\'回声时域波形\');
1.4运行结果
仿真结果分析:我听到了原声和音量放大减小的声音,也听到了混音和回声的效果,变化明显;本题我画了音乐和两个语音信号的时域波形以及混音回声的时域波形,音乐信号幅度比语音信号高且连贯性高,混音之后幅度叠加,回声之后幅度也增大,波形有很明显的变化。
2、语音/音乐信号的频谱和音谱的观察
2.1题目要求
① 输出语音/音乐信号的波形和频谱,观察现象;
② 使用sound语句播放语音/音乐信号,注意不同抽样率下音调变化,解释现象。
2.2设计内容及方案
本题读取音频信号、画时域波形和播放原理和上题一样,涉及的新内容有:
① 画频谱图:我将横坐标设为频率f,纵坐标需要用fft函数求傅里叶变换然后利用abs函数求幅值画幅度谱,再用plot画出频谱图。
② 调节频率:我将频率fs乘一个系数放大缩小并播放,感受频率对语音的影响。
2.3程序源码及注释
clear [x,fs] = wavread(\'beautiful.wav\');%音乐信号 [y,fs1]= wavread(\'1.wav\');%女生声音 [z,fs2]= wavread(\'2.wav\');%男生声音 %输出频率 fs fs1 fs2 %音乐语音信号分声道处理 x1=x(:,1); y1=y(:,1); z1=z(:,1); %画音乐信号时域图 n1=length(x1);%length取数列长度即元素个数 figure(1) subplot(2,1,1); t1=(0:(n1-1))/fs; plot(t1,x1); axis([0,5,-1,1]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'音乐信号时域波形\'); %画音乐信号频域图 X1=fft(x1,n1); subplot(2,1,2); f1=0:fs/n1:fs*(n1-1)/n1; plot(f1,abs(X1));%也可以使用fftshift函数使fft后的结果以fs/2为中心左右互换 axis([0,44100,0,6000]); xlabel(\'频率f\'); ylabel(\'幅度\'); title(\'音乐信号频谱\'); %画女生语音信号时域图 n2=length(y1); figure(2) subplot(2,2,1); t2=(0:(n2-1))/fs1; plot(t2,y1); axis([0,4,-0.5,0.5]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'女生语音信号时域波形\'); %画女生语音信号频域图 Y=fft(y1,n2); subplot(2,2,2); f2=0:fs1/n2:fs1*(n2-1)/n2; plot(f2,abs(Y)); axis([0,48000,0,700]); xlabel(\'频率f\'); ylabel(\'幅度\'); title(\'女生语音信号频谱\'); %画男生语音信号时域图 n3=length(z1); subplot(2,2,3); t3=(0:(n3-1))/fs2; plot(t3,z1); axis([0,4,-0.5,0.5]); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'男生语音信号时域波形\'); %画男生语音信号频域图 Z=fft(z1,n3); subplot(2,2,4); f3=0:fs2/n3:fs2*(n3-1)/n3; plot(f3,abs(Z)); axis([0,48000,0,700]); xlabel(\'频率f\'); ylabel(\'幅度\'); title(\'男生语音信号频谱\'); %不同抽样率语音信号 sound(y1,fs);%播放原音乐 pause(5); sound(y1,2*fs);%播放高频率音乐 pause(2); sound(y1,0.5*fs);%播放低频率音乐
2.4运行结果
仿真结果分析:本题中画了频谱图,可以更直观的看到信号的特征,包括截至频率和音频范围,我的音乐和语音信号主要集中在低频段,而且音乐信号的幅度要比语音信号的幅度高。通过放大缩小频率的声音变化,即频率大时语调变高且语速加快,让我感受到了频率对信号的作用。
3、语音/音乐信号的抽取(减抽样)
3.1题目要求
① 观察语音/音乐信号频率的上限,选择适当的抽取间隔对信号进行减抽样(给出两种抽取间隔,代表混叠与非混叠);
② 输出减抽样语音/音乐信号的波形和频谱,观察现象,给出理论解释;
③ 播放减抽样语音/音乐信号,注意抽样率改变,比较不同抽取间隔下的声音,解释现象。
3.2设计内容及方案
减抽样:本题研究的唯一内容就是对信号以不同间隔抽样,我抽取了200000长度的信号,便于以一定间隔抽样。首先我以小间隔2抽样,信号声音基本和原声差不多,没有发生混叠;而后我又用大间隔20抽样,信号声音有了很明显的变化,即发生了混叠。
3.3程序源码及注释
clear [x,fs]=wavread(\'beautiful.wav\');%音乐信号 x1=x(:,1);%取单列 x2=x1(1:200000);%截取长度 N1=length(x2)%求信号长度 %画原信号时域波形和频谱 t1=(0:(N1-1))/fs; figure(1); subplot(2,1,1); plot(t1,x2); title(\'原信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); f1=0:fs/N1:fs*(N1-1)/N1; Fx1=fft(x2,N1); %求傅里叶变换 subplot(2,1,2); plot(f1,abs(Fx1)); title(\'原信号的频谱\');%画原信号频谱 xlabel(\'频率f\'); ylabel(\'幅度\'); %非混叠间隔减抽样 d1=2;j=0; for i=1:d1:200000 j=j+1; x22(j)=x2(i);%对信号以d1为间隔做减抽样 end N2=length(x22);%对信号以d1为间隔做减抽样的长度 %画d1间隔抽样图 t2=(0:(N2-1))/fs; figure(2); subplot(2,1,1); plot(t2,x22); title(\'以d1为间隔减抽样时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,1,2); f2=0:(fs/d1)/N2:(fs/d1)*(N2-1)/N2; Fx2=fft(x22,N2);%求傅里叶变换画频谱 plot(f2,abs(Fx2)); title(\'以d1为间隔减抽样后的频谱(非混叠)\'); xlabel(\'频率f\'); ylabel(\'幅度\'); %混叠间隔减抽样 d2=20;j=0; for i=1:d2:200000 j=j+1; x3(j)=x2(i);%对信号以d2为间隔做减抽样 end N3=length(x3) ;%对信号以d2为间隔做减抽样长度 %画d2间隔抽样图 t3=(0:(N3-1))/fs; figure(3) subplot(2,1,1); plot(t3,x3); title(\'以d2为间隔减抽样后的时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,1,2); f3=0:(fs/d2)/N3:(fs/d2)*(N3-1)/N3; Fx3=fft(x3,N3);%求傅里叶变换画频谱 plot(f3,abs(Fx3)); title(\'以d2为间隔减抽样后的频谱(混叠)\'); xlabel(\'频率f\'); ylabel(\'幅度\'); %播放减抽样信号 sound(x2,fs);%原信号播放 pause(5); sound(x22,fs/d1);%以d1为间隔减抽样信号播放(非混叠) pause(8); sound(x3,fs*(1/d2));%以d2为间隔减抽样信号播放(混叠)
3.4运行结果
仿真结果分析:从信号的时域波形和频谱图可以看出抽样后时间范围和频率范围都有所减小,小间隔抽样频谱波形变化比较小,没有发生混叠,大间隔抽样频谱波形有了很大的变化,发生了混叠。抽取间隔越小,声音越清晰,时间间隔越大,声音越不清晰,混叠现象越明显。未混叠时,声音尖锐,混叠时,声音轻,只有淡淡的音调,基本没有起伏,不清晰。
原因:采样频率fs必须大于等于2fc,采样频率小于2fc时,发生混叠,若采样频率越小,则混叠越明显。我的图中fc不到5000Hz,间隔2采样频率fs为22000Hz大于两倍的fc所以不混叠;间隔20采样频率fs为2200Hz小于两倍的fc所以发生混叠。
4 语音/音乐信号的AM调制
4.1题目要求
① 观察语音/音乐信号的频率上限,选择适当调制频率对信号进行调制(给出高、低两种调制频率);
② 输出调制信号的波形和频谱,观察现象,给出理论解释;
③ 播放调制语音/音乐信号,注意不同调制频率下的声音,解释现象。
4.2设计内容及方案
在这道题中我统一使用了频率归一化,便于从原信号中读取截止频率和设置载波频率。
① 取低频载波对信号进行AM调制:这里取了0.1pi为低频调制载波频率,与原信号相乘实现AM调制,这里用点乘转置矩阵实现。
② 取高频载波对信号进行AM调制:这里取了0.7pi为低频调制载波频率,与原信号相乘实现AM调制,这里用点乘转置矩阵实现。
③ 播放调制后信号:分别播放低频和高频调制时的音乐,用sound函数播放。
4.3程序源码及注释
clear [x,fs]=wavread(\'beautiful.wav\'); %读取音乐信号 x1=x(:,1);%取单列 N=length(x1);%求信号长度 n=0:N-1;%所有元素 t=(0:(N-1))/fs;%时间 f=0:fs/N:fs*(N-1)/N;%频率 w=2*f/fs;%归一化 %画原信号时域波形和频谱 figure(1); subplot(2,1,1); plot(t,x1); title(\'原信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); Fx1=fft(x1,N); %求傅里叶变换 subplot(2,1,2); plot(w,abs(Fx1)); title(\'原信号的频谱\');%画原信号频谱 xlabel(\'w\'); ylabel(\'幅度\'); %低频调制 x2=cos(n*0.1*pi);%低频时余弦信号 x22=x1.*x2\';%低频调制信号 X2=fft(x2); X22=fft(x22); %高频调制 x3=cos(n*0.7*pi);%高频时余弦信号 x33=x1.*x3\';%高频调制信号 X3=fft(x3); X33=fft(x33); %画出低频时载波和调制信号波形 figure(2) subplot(2,2,1); plot(t,x2); axis([0,0.001,-1,1]); title(\'低频时余弦信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,2,2); plot(w,abs(X2)); title(\'低频时余弦信号频谱\'); xlabel(\'w\'); ylabel(\'幅度\'); subplot(2,2,3); plot(t,x22); title(\'低频调制信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,2,4); plot(w,abs(X22)); title(\'低频调制信号频谱\'); xlabel(\'w\'); ylabel(\'幅度\'); %画出高频时载波和调制信号波形 figure(3) subplot(2,2,1); plot(t,x3); axis([0,0.001,-1,1]); title(\'高频时余弦信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,2,2); plot(w,abs(X3)); title(\'高频时余弦信号频谱\'); xlabel(\'w\'); ylabel(\'幅度\'); subplot(2,2,3); plot(t,x33); title(\'高频调制信号时域波形\'); xlabel(\'时间t\'); ylabel(\'幅度\'); subplot(2,2,4); plot(w,abs(X33)); title(\'高频调制信号频谱\'); xlabel(\'w\'); ylabel(\'幅度\'); %播放调制信号 sound(x1,fs);%播放原音乐 pause(5); sound(x22,fs);%低频调制播放 pause(5); sound(x33,fs);%高频调制播放
4.4运行结果
仿真结果分析:从图中可以看出原音乐信号的截止频率为0.2pi,这里设置了0.1pi和0.7pi两种频率对信号进行AM调制,原信号的调制相当于频谱搬移, 左移一个右移一个,调制的目的是便于信号在信道中传输。当调制频率较高时,声音响度低,几乎只能听见兹兹的声音, 信号几乎完全失真,当调制频率较低时,声音很尖锐,响度较大,能听出调子,但也有兹兹的声音。
5、AM调制语音/音乐信号的同步解调
5.1题目要求
① 设计巴特沃斯滤波器完成同步解调,观察滤波器频率响应曲线;
② 窗函数法设计FIR滤波器完成同步解调,观察滤波器频率响应曲线(要求:分别使用矩形窗和布莱克曼窗,进行比较);
③ 输出解调信号的波形和频谱,观察现象,给出理论解释;
④ 播放解调语音/音乐信号,比较不同滤波器下的声音,解释现象。
5.2设计内容及方案
① 对调制后的信号进行解调:将调制后的信号与调制时相同的载波相乘实现解调,这里用点乘转置矩阵实现。
② 用巴特沃斯滤波器对解调信号进行滤波:首先求巴特沃斯滤波器的频率响应,其中用到了buttord求满足性能指标的滤波器阶数N和3dB截止频率wc、用butter计算模拟滤波器的传输函数Ha(s)、用freqz求频响。然后用filter实现滤波。
③ 用矩形窗FIR滤波器对解调信号进行滤波:首先求矩形窗FIR滤波器的频率响应,其中先求理想低通单位脉冲响应hd,然后加矩形窗截断求模拟脉冲响应,再利用freqz求频率响应。然后利用卷积conv实现滤波。
④ 用布莱克曼窗FIR滤波器对解调信号进行滤波:首先求布莱克曼窗FIR滤波器的频率响应,其中先求理想低通单位脉冲响应hd,然后加布莱克曼窗截断求模拟脉冲响应,再利用freqz求频率响应。然后利用卷积conv实现滤波。
⑤ 播放调制、解调和滤波后的声音:通过声音变化感受调制、解调和滤波。
5.3程序源码及注释
clear [y,fs]=audioread(\'beautiful.wav\');%读取音乐信号 y1=y(:,1);%取单列 N1=length(y1);%求信号长度 n=0:N1-1;%所有元素 t=n/fs;%时间 f=0:fs/N1:fs*(N1-1)/N1;%频率 w=2*f/fs;%归一化 y2=cos(n*pi*0.12);%0.12pi时余弦信号 Y=y1.*y2\';%音乐信号AM调制 Y2=Y.*y2\';%解调相乘器 Y22=fft(Y2);%傅里叶变换 %画解调信号时域波形和频谱 figure(1); subplot(2,1,1); plot(t,Y2); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'解调信号时域波形\'); subplot(2,1,2); plot(w,abs(Y22)); xlabel(\'w\'); ylabel(\'幅度\'); title(\'解调信号频谱\'); %求巴特沃斯滤波器频率响应 wp=0.12;ws=0.3;rp=1;rs=50; %设计巴特沃斯IIR滤波器参数 [N,wc]=buttord(wp,ws,rp,rs); %求满足性能指标的滤波器阶数N和3dB截止频率wc [b,a]=butter(N,wc); %计算模拟滤波器的传输函数Ha(s) [Hd,w]=freqz(b,a);%求频响 figure(2) subplot(3,1,1); plot(w/pi,abs(Hd)); axis([0,1,0,1.5]); xlabel(\'w/π\'); ylabel(\'幅度\'); title(\'巴特沃斯频率响应曲线\'); %求巴特沃斯滤波器滤波信号 Y3=filter(b,a,Y2);%滤波音乐信号 N3=length(Y3) t1=(0:(N3-1))/fs;%时间 f1=0:fs/N3:fs*(N3-1)/N3;%频率 w1=2*f1/fs;%归一化 Y33=fft(Y3);%傅里叶变换 subplot(3,1,2); plot(t1,Y3); xlabel(\'时间t\'); ylabel(\'幅度\'); title(\'巴特沃斯滤波信号时域波形\'); subplot(
请发表评论