基于matlab的语音信号处理

摘要

利用所学习的数字信号处理知识,设计了一个有趣的音效处理系统,首先设计了几种不同的滤波器对声音进行滤波处理,分析了时域和频域的变化,比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放,变速播放,回响,音调转换等处理效果,其中音调转换部分使用了重新采样改变基频,再进行时长规整的算法。

基于MATLAB的语音信号处理

语音信号的采集

录制或者截取一段音乐,时间在1分钟左右,存为.wav的文件。然后利用wavread对语音信号进行采样。我们一共选择了3段语音,其中

d.wav 真心英雄(周华健)(男声)

man.wav我的歌声里(自己录制)(男声)

girl.wav看的最远的地方(张韶涵)(女声)

语音信号的频谱分析

使用matlab画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,画出频谱图,分析频率成分。这里我们分析的是d.wav,通过分析知道频率分布在0---10KHz,主要分布在低频。

数字滤波器设计

这里我们设计了4种滤波器对语音进行处理,分别为椭圆低通滤波,椭圆高通滤波,等波纹逼近法FIR带通滤波器,双线性变换法切比雪夫数字高通滤波器,绘制出相应的幅度、相位谱图,滤波后的波形、频谱图。

各滤波器的设计如下:

椭圆低通滤波器:fb=1 200 Hz,fc=1 400 Hz,As=100 dB,Ap=1 dB

椭圆高通滤波器:fc=4 800 Hz,fb=5 000 Hz As=100 dB,Ap=1 dB

等波纹逼近法设计FIR带通滤波器

fb1=1200Hz,fb2=3000Hz,fc1=1000Hz,fc2=3000Hz,As=100dB,Ap=1dB

双线性变换法切比雪夫数字高通滤波器

fc=4 800 Hz,fb=5 000 Hz As=100 dB,Ap=1 dB

滤波处理后,我们用函数sound()可以对声音进行回放,调用格式:sound(x,fs,bits);感觉滤波前后的声音。语音的低频部分沉稳,空间感较强;中频部分音质一般;高频部分音质非常尖锐,略微有尖音。此外中高频的幅度都不大,回放时音量较低。

语音变速播放

改变语音的播放速度也就是改变采样间隔(即改变了采样频率),但是这个频实现率依然要在2f(Nyquist rate)之上,否则就会产生失真。

%变速-慢放%

w=0.9;

M=w*fs; %w>1为快放,w<1为慢放

sound(x,M,nbits);

语音倒放

使用flipud()倒置语音矩阵,逆序输出音频即可。

回响效果

回声在时域上幅值减小了,频域上的特征不变,只需要把原信号添加一个延时(delay)和对时域的幅度添加一个参数.然后和原信号叠加即可获得回响效果。

实现男女声转换音效效果

我们使用另外写的voice(x,f)函数实现音调转换,x为需要转换的声音,通过抽取插值更改采样率来改变基频,当f>1时音调降低;f<1音调升高。然后再进行时长整合使语音文件恢复原来的时长。时长整合使用重叠叠加算法来实现。经过我们试听,转换效果还是很好的。

总结体会

通过对声音信号的滤波处理,比较其前后变化,感受到了滤波器在声音信号处理当中的作用,同时在实践中掌握了滤波器的基本设计方法,加深了对各种类型的数字滤波器特性的理解。我们通过对声音的各种变换,产生了多种不同的音效,也体会到了语音处理的魅力。在课程设计过程中,我们发现自己对Matlab的应用还是不够熟练,基础不够扎实,花了不少时间编写调试。

代码附录

%读取声音信号%

y,fs,nbits\]=wavread('d'); %读取声音文件 x=y(:,1); %读入的y矩阵有两列,取第1列 N=length(x); n=0:N-1; X= fft(x); %傅里叶变换 Fs=2\*fs; %2倍频 T=1/Fs; f=n/N\*Fs; figure; subplot(2,1,1); plot(n,x); %声音的时域波形 title('原声音的波形'); xlabel('t/s'); ylabel('magnitude'); subplot(2,1,2); plot(f,abs(X)); %声音的频谱 title('原声音的频谱'); xlabel('frequency/Hz'); ylabel('magnitude'); % 滤波器设计% % 椭圆低通滤波器% fp1=1200;fs1=1400; %低通滤波器通带截止频率1200Hz和阻带截止频率1400Hz wp1=2\*fp1/Fs; ws1=2\*fs1/Fs;rp=1;as=100; \[N1,wp1\]=ellipord(wp1,ws1,rp,as); %计算椭圆低通模拟滤波器的阶数和通带边界频率 \[B,A\]=ellip(N1,rp,as,wp1); %计算低通滤波器模拟滤波器系统函数系数 y1=filter(B,A,x); %滤波器软件实现 % 低通滤波器绘图部分% figure; freqz(B,A); figure; subplot(2,1,1); t=n\*T; plot(t,y1); xlabel('t/s');ylabel('magnitude');title('低通滤波后的波形'); axis(\[0,t(end),min(y1),1.2\*max(y1)\])%坐标范围 subplot(2,1,2); plot(f,abs(fft(y1))); %椭圆高通滤波器% fp2=4800;fs2=5000; %高通滤波器通带截止频率5000Hz和阻带截止频率4800Hz wp2=2\*fp2/Fs; ws2=2\*fs2/Fs;rp=1;as=100; \[N2,wp2\]=ellipord(wp2,ws2,rp,as); \[B2,A2\]=ellip(N2,rp,as,wp2,'high'); %计算高通滤波器模拟滤波器系统函数系数 y2=filter(B2,A2,x); %滤波器软件实现 % 高通滤波器绘图部分% figure; freqz(B2,A2); figure; subplot(2,1,1); t=n\*T; plot(t,y2); xlabel('t/s');ylabel('magnitude');title('高通滤波后的波形'); axis(\[0,t(end),min(y2),1.2\*max(y2)\]) subplot(2,1,2); plot(f,abs(fft(y2))); %等波纹逼近法设计FIR带通滤波器及滤波 \[I,fs,nbits\]=wavread('d'); y=I(:,1); fp1=1200;fp2=3000;fc1=1000;fc2=3200;FS=2\*fs;rp=1;rs=100; f=\[fc1,fp1,fp2,fc2\]; m=\[0,1,0\]; dat1=(10\^(rp/20)-1)/(10\^(rp/20)+1);dat2=10\^(-rs/20); rip=\[dat2,dat1,dat2\]; \[M,fo,mo,w\]=remezord(f,m,rip,FS); M=M+1; hn=remez(M,fo,mo,w); figure(1); freqz(hn); Y=fft(y); y1=fftfilt(hn,y); %用remez设计的滤波器进行滤波 Y1=fft(y1); n=0:length(y)-1; figure(2); subplot(221);plot(y);title('未滤波语音波形'); subplot(222);plot(y1);title('等波纹逼近法滤波后语音波形'); subplot(223);plot(n,Y);title('未滤波语音频谱'); subplot(224);plot(n,Y1);title('等波纹逼近法滤波后语音频谱'); sound(y1,fs,nbits); %滤波后语音回放 %cheby1设计模拟高通滤波器再经双线性变换法设计成数字高通滤波器 fp=5000;fc=4800;rp=1;rs=100;FS=2\*fs; wpz=2\*pi\*fp/FS;wsz=2\*pi\*fc/FS; wp=2\*tan(wpz/2)\*FS;ws=2\*tan(wsz/2)\*FS; %预畸校正转换指标 \[N,wpo\]=cheb1ord(wp,ws,rp,rs,'s'); \[BH,AH\]=cheby1(N,rp,wpo,'high','s'); \[Bz,Az\]=bilinear(BH,AH,FS); w=0:0.01\*pi:pi; \[h,w\]=freqz(Bz,Az,w); plot(w/pi,20\*log(abs(h)),'k');axis(\[0,1,-800,100\]); xlabel('w/pi');ylabel('幅度/dB');grid; title('cheby1数字高通滤波器'); Y=fft(y); y1=filter(Bz,Az,y); Y1=fft(y1); n=0:length(y)-1; figure(2); subplot(221);plot(y);title('未滤波语音波形'); subplot(222);plot(y1);title('cheby滤波后语音波形'); subplot(223);plot(n,Y);title('未滤波语音频谱'); subplot(224);plot(n,Y1);title('cheby滤波后语音频谱'); sound(y1,fs,nbits); %滤波后语音回放 %播放声音% sound(x,fs,nbits); %原声 sound(5\*y1,fs,nbits); %低通 sound(5\*y2,fs,nbits); %高通 %变速-慢放% w=0.9; M=w\*fs; %w\>1为快放,w\<1为慢放 sound(x,M,nbits); %语音倒放% y0=flipud(x); sound(y0); %回声% z=\[zeros(5000,1);x\]; %延时5000个点 x1=\[x;zeros(5000,1)\]; %使原声音长度与延时后相等 y1=x1+0.4\*z; %原声+延时衰减 figure; plot(y1); title('加入回声的波形'); sound(5\*y1,fs,nbits); %调用函数voice()实现音调转换% %男声转换为女声% \[y,fs,nbits\]=wavread('man'); %读取声音文件 x=y(:,1); %读入的y矩阵有两列,取第1列 y1=voice(x,0.71); %调整voice()第2个参数转换音调,\>1降调,\<1升调,y1为x转换后的声音 N=length(x); M=length(y1); n=0:N-1; m=0:M-1; X= fft(x); Y=fft(y1); %傅里叶变换 Fs=2\*fs; %2倍频 T=1/Fs; T1=1/Fs\*0.71; f=n/N\*Fs; f1=m/M\*Fs/0.71; t=n\*T; t1=m\*T1; figure; subplot(2,1,1); plot(t,x); xlabel('t/s');ylabel('magnitude');title('转换前的波形'); subplot(2,1,2); plot(t1,y1); xlabel('t/s');ylabel('magnitude');title('转换后的波形'); figure; subplot(2,1,1); plot(f,abs(X)); xlabel('frequency/Hz');ylabel('magnitude');title('转换前的频谱'); subplot(2,1,2); plot(f1,abs(Y)); xlabel('frequency/Hz');ylabel('magnitude');title('转换后的频谱'); sound(y1,fs,nbits); %女声转换为男声% \[y,fs,nbits\]=wavread('girl'); %读取声音文件 x=y(:,1); %读入的y矩阵有两列,取第1列 sound(voice(x,1.3),fs,nbits); %调整voice()第2个参数转换音调,\>1降调,\<1升调 function Y=voice(x,f) %更改采样率使基频改变 f\>1降低;f\<1升高 f=round(f\*1000); d=resample(x,f,1000); %时长整合使语音文件恢复原来时长 W=400; Wov=W/2; Kmax=W\*2; Wsim=Wov; xdecim=8; kdecim=2; X=d'; F=f/1000; Ss =W-Wov; xpts = size(X,2); ypts = round(xpts / F); Y = zeros(1, ypts); xfwin = (1:Wov)/(Wov+1); ovix = (1-Wov):0; newix = 1:(W-Wov); simix = (1:xdecim:Wsim) - Wsim; padX = \[zeros(1, Wsim), X, zeros(1,Kmax+W-Wov)\]; Y(1:Wsim) = X(1:Wsim); lastxpos = 0; km = 0; for ypos = Wsim:Ss:(ypts-W) xpos = round(F \* ypos); kmpred = km + (xpos - lastxpos); lastxpos = xpos; if (kmpred \<= Kmax) km = kmpred; else ysim = Y(ypos + simix); rxy = zeros(1, Kmax+1); rxx = zeros(1, Kmax+1); Kmin = 0; for k = Kmin:kdecim:Kmax xsim = padX(Wsim + xpos + k + simix); rxx(k+1) = norm(xsim); rxy(k+1) = (ysim \* xsim'); end Rxy = (rxx \~= 0).\*rxy./(rxx+(rxx==0)); km = min(find(Rxy == max(Rxy))-1); end xabs = xpos+km; Y(ypos+ovix) = ((1-xfwin).\*Y(ypos+ovix)) + (xfwin.\*padX(Wsim+xabs+ovix)); Y(ypos+newix) = padX(Wsim+xabs+newix); end end

相关推荐
lixy57932 分钟前
深度学习之自动微分
人工智能·python·深度学习
量子位33 分钟前
飞猪 AI 意外出圈!邀请码被黄牛倒卖,分分钟搞定机酒预订,堪比专业定制团队
人工智能·llm·aigc
量子位33 分钟前
趣丸科技贾朔:AI 音乐迎来应用元年,五年内将重构产业格局|中国 AIGC 产业峰会
人工智能·aigc
量子位33 分钟前
粉笔 CTO:大模型打破教育「不可能三角」,因材施教真正成为可能|中国 AIGC 产业峰会
人工智能·aigc
神经星星36 分钟前
【TVM教程】microTVM TFLite 指南
人工智能·机器学习·编程语言
Listennnn36 分钟前
GPT,Bert类模型对比
人工智能·gpt·自然语言处理·bert
量子位43 分钟前
最强视觉生成模型获马斯克连夜关注,吉卜力风格转绘不再需要 GPT 了
人工智能·llm
arbboter2 小时前
【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能
人工智能·notepad++·notepad++插件开发·ai对话窗口·异步模型调用·实时输出渲染·动态模型切换
SunsPlanter2 小时前
机器学习期末
人工智能·机器学习
吹风看太阳2 小时前
机器学习02——RNN
人工智能·rnn·机器学习