設計目的和內容
通過數字信號處理的大作業設計,鞏固和運用數字信號處理課程中的理論知識和實驗技能,掌握最基本的數字信號處理的理論和方法。本次設計的題目是:語音信號的處理與濾波。
具體來說就是對一段語音信號進行采樣;畫出采樣后語音信號的時域波形和頻譜圖;然后給采樣信號加以噪聲,采用雙線性變換設計IIR濾波器;然后用設計的濾波器對加噪聲的信號進行濾波,畫出濾波后信號的時域波形和頻譜,并對濾波前后的信號進行對比,分析信號的變化;分別回放原始、加噪聲、濾波后語音信號,感受其直觀變化。
設計原理
1.語音信號的采集
語音信號是一種模擬信號,首先須經過采樣將其轉換為數字信號,實質是把連續信號變為脈沖或數字序列。我們用Windows10自帶的錄音機錄制一段mp3格式的音頻。然后用MATLAB的audioread函式采樣。配合sound函式來使用。
2.語音信號的頻譜特性
在MATLAB中,可以利用函式fft對信號進行快速傅里葉變換,得到信號的頻譜特性。
3.語音信號的時域分析
語音信號的時域分析就是分析和提取語音信號的時域引數。。進行語音分析時,最先接觸到并且也是最直觀的是它的時域波形。語音信號本身就是時域信號,因而時域分析是最早使用,也是應用最廣泛的一種分析方法,這種方法直接利用語音信號的時域波形。
設計程序
1.語音信號的采集
我們用Windows10自帶的錄音機錄制一段mp3格式的音頻,我錄制了一段30秒左右的音樂。將然后用MATLAB的audioread函式對這一段語音進行采樣。配合sound函式使用可播放該語音信號
2.對語音信號進行頻譜分析
處理語音信號的時域波形圖,對語音信號進行快速傅立葉變換,得到信號的頻譜。
運行后會播放原始音樂,并且出現的時域波形圖和頻譜圖:
語音信號加噪聲并回放加噪聲語音信號
使用randn函式產生噪聲,并將其加入到原始語音信號中。
運行后,會播放加噪聲后的語音信號,可以聽見有明顯的“雪花”聲。并且出現如下的時域波形圖和頻譜圖:
根據指標設計數字濾波器
可以運用窗函式法、雙線性變換法設計低通、高通、帶通三種濾波器。我選用雙線性變換法進行設計低通濾波器。
運行后可以得到濾波器的特性圖
用濾波器對信號進行濾波并回放濾波語音信號
運行后,噪聲比加噪音的信號要小,但是還能聽見一些“雪花”聲。其波形,頻譜如下:
(我還使用了ellipord函式,分別設計了低通,高通,帶通濾波器,但是除了低通濾波器具有一定的效果以外,高通和帶通濾波器都沒有很好地效果)
設計總結
通過這次課程設計,讓我對MATLAB有了深入的了解。由于電腦只安裝了2018a版本的MATLAB。于我上課所用的MATLAB具有一定不同,所以去查了許多的資料,才完成了這次的大作業。這次設計主要參考了CSDN上的一些大佬做的設計,看了他們很多的代碼,自己才慢慢的懂得了如何去寫一些代碼,和一些代碼的作用。這次設計讓我懂得了,要完成一件事需要很多很多的努力。努力就會有識訓。
附錄:實驗程式
雙擊圖示打開錄音,程式運行中按任意鍵繼續
===============大作業實驗程式===============
[x,fs]=audioread('E:\MATLAB\music.mp3');%聲音讀取
sound(x,fs); %播放原始的語音
x=x(:,1);
FS=length(x);%求出原始語音信號長度
X=fft(x);%傅里葉變換
t=(0:FS-1)/fs;
figure(1)
subplot(211);
plot(t,x);
title('原始語音信號時域波形');
xlabel('時間');
ylabel('幅度');
grid on;%顯示坐標軸網格線
subplot(212);
plot(abs(X));
title('原始語音信號頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 1400000 0 20]);
grid on;
pause;%暫停
FS=length(x);
noise=0.01*randn(FS,1);%加噪聲
s=x+noise;
sound(s,fs); %播放加噪的語音
N=length(s); %畫出加噪之后,其時域頻域
S=fft(s,N);
figure(2)
subplot(211)
plot(s);
title('加噪聲后信號波形')
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212)
plot(abs(fftshift(S)));
xlabel('頻率');
ylabel('幅度');
axis([0 1400000 0 20]);
title('加噪聲后信號信號頻譜');
grid on;
pause;
%設計IIR低通濾波器
Rp=2;Rs=80;
Ft=8000;%采樣頻率
Fp=2000;
Fs=1000;
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;%求出待設計的模擬濾波器的邊界頻率
[N,wn]=buttord(wp,ws,Rp,Rs,'s'); %設計過渡模擬濾波器:計算相應的模擬濾波器階數N和截止頻率wn
[b,a]=butter(N,wn,'s'); %S域頻率回應的引數即:計算相應的模擬濾波器系統函式
[bz,az]=bilinear(b,a,0.5); %利用雙線性變換轉換成數字濾波器
figure(3);%繪圖
[h,w]=freqz(bz,az);%低通濾波器特性
title('IIR低通濾波器');
plot(w*fs/(2*pi),abs(h));
grid on
%濾波
z=filter(bz,az,s); %濾波后畫出其頻譜,波形
Z=fft(z); %濾波后的信號頻譜
figure(4)
subplot(211);
plot(z);
title('低通濾波后的信號波形');
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212);
plot(abs(fftshift(Z)));
title('低通濾波后信號的頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 1400000 0 20]);
grid on;
sound(z,fs); %回放濾波后的信號
pause;
=================額外的試驗程式================
[x,fs]=audioread('E:\MATLAB\music.mp3');%聲音讀取
x=x(:,1);
FS=length(x);%求出原始語音信號長度
X=fft(x);%傅里葉變換
t=(0:FS-1)/fs;
figure(1)
subplot(211);
plot(t,x);
title('原始語音信號時域波形');
xlabel('時間');
ylabel('幅度');
grid on;%顯示坐標軸網格線
subplot(212);
plot(abs(X));
title('原始語音信號頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 700000 0 20]);
grid on;
sound(x,fs); %播放原始的語音
pause;%暫停
FS=length(x);
noise=0.01*randn(FS,1);%加噪聲
s=x+noise;
N=length(s); %畫出加噪之后,其時域頻域
S=fft(s,N);
figure(2)
subplot(211)
plot(s);
title('加噪聲后信號波形')
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212)
plot(abs(fftshift(S)));
xlabel('頻率');
ylabel('幅度');
axis([0 700000 0 20]);
title('加噪聲后信號信號頻譜');
grid on;
sound(s,fs); %播放加噪的語音
pause;
%設計IIR低通濾波器
Rp=2;
Rs=80;
Ft=8000;%采樣頻率
Fp=2000;
Fs=1000;
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;%求出待設計的模擬濾波器的邊界頻率
[N,wn]=buttord(wp,ws,Rp,Rs,'s');
[b,a]=butter(N,wn,'s');
[bz,az]=bilinear(b,a,0.5);
figure(3);%繪圖
[h,w]=freqz(bz,az);%低通濾波器特性
title('IIR低通濾波器');
plot(w*fs/(2*pi),abs(h));
grid on
%濾波
z=filter(bz,az,s); %濾波后畫出其頻譜,波形
Z=fft(z); %濾波后的信號頻譜
figure(4)
subplot(211);
plot(z);
title('低通濾波后的信號波形');
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212);
plot(abs(fftshift(Z)));
title('低通濾波后信號的頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 700000 0 20]);
grid on;
sound(z,fs); %回放濾波后的信號
pause;
%設計IIR高通濾波器
Rp=2;
Rs=80;
Ft=8000;%采樣頻率
Fp=1200;
Fs=2200;
wp=2*pi*Fp/Ft;
ws=2*pi*Fs/Ft;%求出待設計的模擬濾波器的邊界頻率
[N,wn]=ellipord(wp,ws,Rp,Rs,'s');
[b,a]=ellip(N,Rp,Rs,wn,'high','s');
[bz,az]=bilinear(b,a,0.5);
%繪圖
figure(5);
[h,w]=freqz(bz,az);%高通濾波器特性
title('IIR高通濾波器');
plot(w*fs/(2*pi),abs(h));
grid on
%濾波
z=filter(bz,az,s); %濾波后畫出其頻譜,波形
Z=fft(z); %濾波后的信號頻譜
figure(6)
subplot(211);
plot(z);
title('高通濾波后的信號波形');
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212);
plot(abs(fftshift(Z)));
title('高通濾波后信號的頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 700000 0 20]);
grid on;
sound(z,fs); %回放濾波后的信號
pause;
%設計IIR帶通濾波器
Rp=2;
Rs=80;
Ft=8000;%采樣頻率
Fp1=1200;
Fp2=3000;
Fs1=1000;
Fs2=3200;
wp=[2*pi*Fp1/Ft,2*pi*Fp2/Ft];
ws=[2*pi*Fs1/Ft,2*pi*Fs2/Ft];%求出待設計的模擬濾波器的邊界頻率
[N,wn]=ellipord(wp,ws,Rp,Rs,'s');
[b,a]=ellip(N,Rp,Rs,wn,'s');
[bz,az]=bilinear(b,a,0.5);
figure(7);%繪圖
[h,w]=freqz(bz,az);%低通濾波器特性
title('IIR高通濾波器');
plot(w*fs/(2*pi),abs(h));
grid on
%濾波
z=filter(bz,az,s); %濾波后畫出其頻譜,波形
Z=fft(z); %濾波后的信號頻譜
figure(8)
subplot(211);
plot(z);
title('帶通濾波后的信號波形');
xlabel('時間');
ylabel('幅度');
grid on;
subplot(212);
plot(abs(fftshift(Z)));
title('帶通濾波后信號的頻譜');
xlabel('頻率');
ylabel('幅度');
axis([0 700000 0 20]);
grid on;
sound(z,fs); %回放濾波后的信號
================運行后影像如下================
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142127.html
標籤:其他
