柚子快報邀請碼778899分享:基于Matlab的語音濾波處理
柚子快報邀請碼778899分享:基于Matlab的語音濾波處理
??????基于matlab的語音信號處理
摘要
利用所學(xué)習(xí)的數(shù)字信號處理知識,設(shè)計了一個有趣的音效處理系統(tǒng),首先設(shè)計了幾種不同的濾波器對聲音進行濾波處理,分析了時域和頻域的變化,比較了經(jīng)過濾波處理后的聲音與原來的聲音有何變化。同時設(shè)計實現(xiàn)了語音的倒放,變速播放,回響,音調(diào)轉(zhuǎn)換等處理效果,其中音調(diào)轉(zhuǎn)換部分使用了重新采樣改變基頻,再進行時長規(guī)整的算法。
基于MATLAB的語音信號處理
語音信號的采集
?錄制或者截取一段音樂,時間在1分鐘左右,存為.wav的文件。然后利用wavread對語音信號進行采樣。我們一共選擇了3段語音,其中
?d.wav 真心英雄(周華?。新暎?/p>
?man.wav我的歌聲里(自己錄制)(男聲)
?girl.wav看的最遠(yuǎn)的地方(張韶涵)(女聲)
語音信號的頻譜分析
使用matlab畫出語音信號的時域波形;然后對語音號進行快速傅里葉變換,得到信號的頻譜特性,畫出頻譜圖,分析頻率成分。這里我們分析的是d.wav,通過分析知道頻率分布在0—10KHz,主要分布在低頻。
數(shù)字濾波器設(shè)計
這里我們設(shè)計了4種濾波器對語音進行處理,分別為橢圓低通濾波,橢圓高通濾波,等波紋逼近法FIR帶通濾波器,雙線性變換法切比雪夫數(shù)字高通濾波器,繪制出相應(yīng)的幅度、相位譜圖,濾波后的波形、頻譜圖。
各濾波器的設(shè)計如下:
橢圓低通濾波器: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
等波紋逼近法設(shè)計FIR帶通濾波器
fb1=1200Hz,fb2=3000Hz,fc1=1000Hz,fc2=3000Hz,As=100dB,Ap=1dB
雙線性變換法切比雪夫數(shù)字高通濾波器
fc=4 800 Hz,fb=5 000 Hz As=100 dB,Ap=1 dB
????
????濾波處理后,我們用函數(shù)sound()可以對聲音進行回放,調(diào)用格式:sound(x,fs,bits);感覺濾波前后的聲音。語音的低頻部分沉穩(wěn),空間感較強;中頻部分音質(zhì)一般;高頻部分音質(zhì)非常尖銳,略微有尖音。此外中高頻的幅度都不大,回放時音量較低。
語音變速播放
改變語音的播放速度也就是改變采樣間隔(即改變了采樣頻率),但是這個頻實現(xiàn)率依然要在2f(Nyquist rate)之上,否則就會產(chǎn)生失真。
%變速-慢放%
w=0.9;
M=w*fs; ???%w>1為快放,w<1為慢放
sound(x,M,nbits);
語音倒放
????使用flipud()倒置語音矩陣,逆序輸出音頻即可。
回響效果
????回聲在時域上幅值減小了,頻域上的特征不變,只需要把原信號添加一個延時(delay)和對時域的幅度添加一個參數(shù).然后和原信號疊加即可獲得回響效果。 ?
實現(xiàn)男女聲轉(zhuǎn)換音效效果
????我們使用另外寫的voice(x,f)函數(shù)實現(xiàn)音調(diào)轉(zhuǎn)換,x為需要轉(zhuǎn)換的聲音,通過抽取插值更改采樣率來改變基頻,當(dāng)f>1時音調(diào)降低;f<1音調(diào)升高。然后再進行時長整合使語音文件恢復(fù)原來的時長。時長整合使用重疊疊加算法來實現(xiàn)。經(jīng)過我們試聽,轉(zhuǎn)換效果還是很好的。
總結(jié)體會
通過對聲音信號的濾波處理,比較其前后變化,感受到了濾波器在聲音信號處理當(dāng)中的作用,同時在實踐中掌握了濾波器的基本設(shè)計方法,加深了對各種類型的數(shù)字濾波器特性的理解。我們通過對聲音的各種變換,產(chǎn)生了多種不同的音效,也體會到了語音處理的魅力。在課程設(shè)計過程中,我們發(fā)現(xiàn)自己對Matlab的應(yīng)用還是不夠熟練,基礎(chǔ)不夠扎實,花了不少時間編寫調(diào)試。
代碼附錄
%讀取聲音信號%
[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');
% 濾波器設(shè)計%
% 橢圓低通濾波器%
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); %計算橢圓低通模擬濾波器的階數(shù)和通帶邊界頻率
[B,A]=ellip(N1,rp,as,wp1); ???????%計算低通濾波器模擬濾波器系統(tǒng)函數(shù)系數(shù)
y1=filter(B,A,x); ????????????????%濾波器軟件實現(xiàn)
% 低通濾波器繪圖部分%
?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)])%坐標(biāo)范圍
?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'); ?%計算高通濾波器模擬濾波器系統(tǒng)函數(shù)系數(shù)
?y2=filter(B2,A2,x); ???????????????????%濾波器軟件實現(xiàn)
% 高通濾波器繪圖部分%
?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)));
%等波紋逼近法設(shè)計FIR?guī)V波器及濾波
[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設(shè)計的濾波器進行濾波
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設(shè)計模擬高通濾波器再經(jīng)雙線性變換法設(shè)計成數(shù)字高通濾波器
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; %預(yù)畸校正轉(zhuǎn)換指標(biāo)
[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數(shù)字高通濾波器');
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);
%調(diào)用函數(shù)voice()實現(xiàn)音調(diào)轉(zhuǎn)換%
%男聲轉(zhuǎn)換為女聲%
[y,fs,nbits]=wavread('man'); %讀取聲音文件
x=y(:,1); ????%讀入的y矩陣有兩列,取第1列
y1=voice(x,0.71); ????%調(diào)整voice()第2個參數(shù)轉(zhuǎn)換音調(diào),>1降調(diào),<1升調(diào),y1為x轉(zhuǎn)換后的聲音
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('轉(zhuǎn)換前的波形');
subplot(2,1,2);
plot(t1,y1);
?xlabel('t/s');ylabel('magnitude');title('轉(zhuǎn)換后的波形');
figure;
subplot(2,1,1);
plot(f,abs(X)); ??????????
?xlabel('frequency/Hz');ylabel('magnitude');title('轉(zhuǎn)換前的頻譜');
subplot(2,1,2);
plot(f1,abs(Y)); ??????????
?xlabel('frequency/Hz');ylabel('magnitude');title('轉(zhuǎn)換后的頻譜');
sound(y1,fs,nbits);
%女聲轉(zhuǎn)換為男聲%
[y,fs,nbits]=wavread('girl'); %讀取聲音文件
x=y(:,1); ????%讀入的y矩陣有兩列,取第1列
sound(voice(x,1.3),fs,nbits);
%調(diào)整voice()第2個參數(shù)轉(zhuǎn)換音調(diào),>1降調(diào),<1升調(diào)
function?Y=voice(x,f)
%更改采樣率使基頻改變 f>1降低;f<1升高
f=round(f*1000);
d=resample(x,f,1000);
%時長整合使語音文件恢復(fù)原來時長
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
柚子快報邀請碼778899分享:基于Matlab的語音濾波處理
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。