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 ...