基於matlab的梅爾濾波器組的設計

2021-09-29 22:11:51 字數 3354 閱讀 2794

clear all; clc; close all;

% 呼叫melbankm函式,在0-0.5區間設計24個mel濾波器,用三角形窗函式

% melbank(p, n, fs, fl, fh, w);

% fs為取樣頻率

% fl是設計濾波器的最低頻率(用fs進行歸一,一般取0)

% fh是設計濾波器的最高頻率(用fs進行歸一,一般取0.5)

% p是在fl和fh之間設計mel濾波器的個數

% n是一幀fft後資料的長度

% w是窗函式,'t'代表三角窗,'m'代表漢明窗,'n'代表漢寧窗

bank = melbankm(24, 256, 8000, 0, 0.5, 't');

bank = full(bank);

bank = bank / max(bank(:)); % 幅值歸一化

df = 8000 / 256; % 計算解析度

ff = (0 : 128) * df;

for k = 1 : 24

plot(ff, bank(k,:), 'k');

hold on;

endhold off;

grid on;

xlabel('頻率/hz');

ylabel('相對幅值');

title('mel濾波器組的頻率響應曲線')

fs = 8000;  %取樣頻率

fl = 0; %fl是設計濾波器的最低頻率

fh = fs / 2; %fh是設計濾波器的最高頻率

bl = 1125 * log(1 + fl/700); %最低頻率對應的mel頻率

bh = 1125 * log(1 + fh/700); %最高頻率對應的mel頻率

p = 24; %在fl和fh之間設計mel濾波器的個數

n = 256; %fft點數,n越大,頻率解析度越高,誤差越小

melf = linspace(0, bh-bl, p+2); %在0至bh-bl的mel頻率範圍內產生p+2個mel頻率值

f = 700 * (exp(melf/1125) - 1); %將上一步產生的p+2個mel頻率值轉化為p+2個實際頻率值

df = fs / n; %計算頻率解析度

n = n/2 + 1; %計算fs/2內對應的fft點數

f = (0:n-1) * df; %計算頻率序列,共有n個頻率點

bank = zeros(24, n); %生成24行n列的全零矩陣

for m = 2:p+1 %下文有m-1出現,且m-1必須為正整數型別,所以m為大於等於2的正整數

f_left = f(m-1); f_mid = f(m); f_right = f(m+1); %f為實際頻率

n_left = ceil(f_left / df); %求頻率f_left對應的fft點數

n_mid = ceil(f_mid / df); %求頻率f_mid對應的fft點數

n_right = ceil(f_right / df); %求頻率f_right對應的fft點數

for k = 1:n %根據fft點數畫三角窗

if k-1>=n_left & k-1<=n_mid

bank(m-1,k) = ((k-1)-n_left)/(n_mid-n_left); %畫第m-1個濾波器的左半部分

elseif k-1>n_mid & k-1<=n_right

bank(m-1,k) = (n_right-(k-1))/(n_right-n_mid); %畫第m-1個濾波器的右半部分

fs = 8000;  %取樣頻率

fl = 0; %fl是設計濾波器的最低頻率

fh = fs / 2; %fh是設計濾波器的最高頻率

bl = 1125 * log(1 + fl/700); %最低頻率對應的mel頻率

bh = 1125 * log(1 + fh/700); %最高頻率對應的mel頻率

p = 24; %在fl和fh之間設計mel濾波器的個數

melf = linspace(0, bh-bl, p+2); %在0至bh-bl的mel頻率範圍內產生p+2個mel頻率值

f = 700 * (exp(melf/1125) - 1); %將上一步產生的p+2個mel頻率值轉化為p+2個實際頻率值

f = 0 : fs/2; %計算頻率序列,共有fs/2+1個頻率點

bank = zeros(24, size(f,2)); %生成24行fs/2+1列的全零矩陣

for m = 2:p+1 %下文有m-1出現,且m-1必須為正整數型別,所以m為大於等於2的正整數

f_left = f(m-1); f_mid = f(m); f_right = f(m+1); %f為實際頻率值,共有p+2個

% m=2時畫第1個濾波器,f_left=f(1),表示第1個實際頻率值;f_mid=f(2),表示第2個實際頻率值;f_right=f(3),表示第3個實際頻率值

% m=3時畫第2個濾波器,f_left=f(2),表示第2個實際頻率值;f_mid=f(3),表示第3個實際頻率值;f_right=f(4),表示第4個實際頻率值

% m=p+1時畫第p個濾波器,f_left=f(p),表示第p個實際頻率值;f_mid=f(p+1),表示第p+1個實際頻率值;f_right=f(p+2),表示第p+2個實際頻率值

for k = 1 : fs/2+1

if f(k)>=f_left & f(k)<=f_mid

bank(m-1,k) = (f(k) - f_left)/(f_mid - f_left); %畫第m-1個濾波器的左半部分

elseif f(k)>f_mid & f(k)<=f_right

bank(m-1,k) = (f_right - f(k))/(f_right - f_mid); %畫第m-1個濾波器的右半部分

matlab 濾波器篇

快畢業了,把自己寫的現成的matlab函式分享給有需要的人,由於個人水平有限,寫的不好請見諒,願意拍磚的儘管拍好了。目前還不考慮讀博,所以寫的程式仍了可惜,所以就拿出來分享。好了不廢話了,開始正題。以下兩個濾波器都是切比雪夫i型數字濾波器,不是巴特沃爾濾波器,請使用者注意!1.低通濾波器 使用說明 ...

matlab設計濾波器

陳懷琛的 數字訊號處理教程 matlab釋義與實現 從效能上來說,iir濾波器傳遞函式包括零點和極點兩組可調因素,對極點的惟一限制是在單位圓內。因此可用較低的階數獲得高的選擇性,所用的儲存單元少,計算量小,效率高。但是這個高效率是以相位的非線性為代價的。選擇性越好,則相位非線性越嚴重。fir濾波器傳...

matlab設計低通濾波器

輸入 被白雜訊汙染的正弦訊號,fs 100khz,訊號頻率為10khz,雜訊訊號為20khz,現在要濾掉20khz的正弦訊號 clear all fs 100000 t 0 1 fs 0.003 f1 10000 f2 20000 signal1 sin 2 pi f1 t signal2 sin ...