學期末,要求一篇關于濾波器的課程設計,不得不把已經忘記的差不多的MATLAB拿過來 “預習預習”,😂以此篇來記錄一下完成這篇小論文的程序,(等以后再回頭看看以前的自己🤞),
文章目錄
- 濾波器
- 設計詳解
- 傅里葉變換
- 帶通濾波器
- 雙線性變換
- 模擬濾波器
- 數字濾波器
- 濾波
- 運行結果
- 源代碼
濾波器
濾波器就是過濾掉我們不想要的,留下我們想要的信號,濾波器可以分為時域濾波和頻域濾波,此設計中我們采用頻域濾波,
設計詳解
傅里葉變換
通過傅里葉變換,從時域轉到頻域,
MATLAB內置函式 fft() 快速傅里葉變換,傅里葉變換后的最高頻率為采樣頻率的一半,(可參考抽樣定理)
帶通濾波器
允許特定頻段的波通過同時屏蔽其他頻段的,
通帶為可以通過的頻域范圍;阻帶是屏蔽的信號的頻率范圍,該設計中設定通帶的頻率為[1825 1950];阻帶的頻率為[1675 2100];這個頻率并不是真正的截止頻率,而是一個范圍值,需要通過 buttord() 函式求得濾波器階數n 和截止頻率wn;
雙線性變換
從s域轉換到z域,
bilinear() 函式
[bz az]=bilinear(b a Fs)
b,a分別是s域的系統函式的分子,分母的系數序列;
bz,az分別是z域的系統函式的分子,分母的系數序列;
Fs是采樣頻率
模擬濾波器
現將設定的通帶的截止頻率[1825 1950],阻帶的截止頻率[1675 2100]轉換成角頻率,用2pi截止頻率/Fs 進行轉換;再將角頻率歸一化處理,在轉換成迷你濾波器的指標,即2/T*tan(截止頻率/2),得到的結果用于下面的函式,
[n wn]=buttord(wp,ws,rp,rs,‘s’);
wp是通帶的截止頻率;ws是阻帶的截止頻率;rp是通帶的最大衰減;rs是阻帶的最小衰減,
[b a]=butter(n,wn,‘s’)
這樣就求得了模擬濾波器的系統函式,
數字濾波器
通過bilinear()函式將模擬濾波器轉換成數字濾波器
濾波
filtfilt() 函式
outdata=filtfilt(bz az Fs)
得到的結果outdata就是濾波后的結果,
運行結果




源代碼
這部分代碼直接運行是不可以的,因為還缺少一個資料包heartsignal_part.mat,換成自己的資料就可以運行了,
clc;
clear;
%[data,fs]=audioread('13262.wav'); %讀取音頻信號
load heartsignal_part.mat; %匯入資料
data=data_pata;
len=length(data);
FS=8000; %設定抽樣頻率
%對信號進行傅里葉變換
fftdata=fft(data);
fftmax=abs(fftdata(1:len/2));%計算幅值
w=(1:len/2)*FS/len;
%繪制原始信號的資訊影像
figure(1);
subplot(2,1,1);
plot(data);
title('原始信號');
ylabel('幅值');
xlabel('時間');
subplot(2,1,2);
plot(w,fftmax);
title('抽樣信號的頻率特性');
ylabel('幅值');
xlabel('頻率');
%設定帶通濾波器
rp=3; %通帶最大衰減
rs=40; %阻帶最小衰減
%頻率轉化為角頻率
tonglow1=2*pi*1825/FS; %通帶最小
tonghigh1=2*pi*1950/FS; %通帶最大
zulow1=2*pi*1675/FS; %阻帶最小
zuhigh1=2*pi*2100/FS; %阻帶最大
%歸一化處理
%預畸變處理,將角頻率引數轉為模擬濾波器引數
tonglow=2*FS*tan(tonglow1/2);
tonghigh=2*FS*tan(tonghigh1/2);
zulow=2*FS*tan(zulow1/2);
zuhigh=2*FS*tan(zuhigh1/2);
tong=[tonglow tonghigh];
zu=[zulow zuhigh];
[n,Wn]=buttord(tong,zu,rp,rs,'s');
[b,a]=butter(n,Wn,'s');
[bz,az]=bilinear(b,a,FS); %雙線性變換
%濾波器的幅頻,相頻特性
[H,h]=freqz(bz,az);
figure(2);
subplot(2,1,1);
plot(h,abs(H));
title('幅頻特性曲線');
ylabel('幅值');
xlabel('頻率');
subplot(2,1,2);
plot(h,angle(H));
title('相頻特性曲線');
ylabel('相位角');
xlabel('頻率');
%濾波
outdata=filtfilt(bz,az,data);
%對濾波后信號進行傅里葉變換
fftoutdata=fft(outdata);
fftoutmax=abs(fftoutdata(1:len/2));%計算幅值
figure(3);
subplot(2,1,1);
plot(w,fftmax);
title('濾波前信號頻譜');
ylabel('幅值');
xlabel('頻率');
subplot(2,1,2);
plot(w,fftoutmax);
title('濾波后信號頻譜');
ylabel('幅值');
xlabel('頻率');
figure(4);
subplot(2,1,1);
plot(data);
title('濾波前信號');
ylabel('幅值');
xlabel('時間');
subplot(2,1,2);
plot(outdata);
title('濾波后信號');
ylabel('幅值');
xlabel('時間');
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238133.html
標籤:其他
上一篇:arduino Uno+arduino D1 實作 阿里云物聯網控制+IIC總線通信點燈
下一篇:第八十四周學習生活總結
