2017-07-01 5 views
1

Matlabのfir2関数でFIRを設計しようとしていますが、私が試みている振幅関数に対応するフィルタの周波数応答を得るのに苦労しています悟る。matlab fir2周波数応答が振幅応答に対応していません

plots of desired and computed response

ここで私は

fs = 48000; %sample rate 
fny = fs/2; %Nyquist frequency 
tabs = 512; %tabs 

%frequency resolution 1/3 octave, length=28 
f = [0 63 80 100 125 160 200 250 315 400 500 630 800 1000 1250 1600 
2000 2500 3150 4000 5000 6300 8000 10000 12500 16000 20000 fny]; 

fn = f/(fny); 

coeffs = fir2(tabs,fn,x); 

figure(1); 
[freq_response,fc] = freqz(coeffs,tabs); 
H = abs(freq_response); 

subplot(2,1,1); 
semilogx(fc*fny,H, 'r'); 
hold on; 
xlim([20 20000]); 
title('frequency response of fir2 filter'); 
xlabel('frequency [Hz]'); 
ylabel('magnitude [dB]'); 
grid on; 
set(gca,'XTick',[20 50 100 200 500 1000 2000 5000 10000 20000]); 

subplot(2,1,2); 
semilogx(f,20*log10(x),'b'); 
title('desired magnitude function'); 
xlabel('frequency [Hz]'); 
ylabel('fir coefficients'); 
grid on; 
xlim([20 20000]); 
set(gca,'XTick',[20 50 100 200 500 1000 2000 5000 10000 20000]); 

は私が間違って何をやっている写真のようxは振幅応答であることと、フィルタ設計のために使用しているコードですか?

答えて

1

まず、関数freqzは、フィルタの伝達関数の分子と分母の多項式係数の両方が必要であることがわかります。周波数応答で必要なポイント数などの追加パラメータを指定することもできますが、これはの後にになります。分子と分母の多項式係数は必須です。明示的な分母を持たないFIRフィルタの場合、暗示的な分母は定数1です。だからあなたの場合にfreqzを呼び出すための正しい方法は次のようになります。

[freq_response,fc] = freqz(coeffs,1,tabs); 

注デフォルトで返される周波数は[0,pi]範囲をカバーする角周波数であることを。 Hzで周波数を取得するには、角周波数を再スケーリングする必要があります(実行しようとしていたが、piの要素がありませんでした)。f*fny/pi。別の方法としては、単にfreqz関数にサンプリングレートを渡すことができます。

[freq_response,fc] = freqz(coeffs,1,tabs,fs); 

あなたはその後、プロットのy軸の目盛りで、残りの問題を持っています。そして、あなたを与える必要があり、同じグラフ上に所望と計算の両方の応答をプロット

[freq_response,fc] = freqz(coeffs,1,tabs,fs); 
H = abs(freq_response); 
... 
semilogx(fc,20*log10(H), 'r'); 

:あなたはdBで振幅応答をプロットしようとしていることを考えると、あなたはデシベルに(リニアスケールである)計算された応答Hを変換する必要があります次のようなもの:

enter image description here

+0

非常に詳細な説明をどうもありがとうございました! は完璧に動作しています:) –

+0

@SimonSymon問題が解決したら、回答を受け入れることを検討してください。 – m7913d

関連する問題