0

fvtoolMatlab (2011a) で関数を使用しようとしています。

これは、多くの機能で構成されたインタラクティブな「ツール」です。私のコードは次のようになります。

%fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726));
b2 = fir1(40,0.5,kaiser(41,7.85726));
b3 = fir1(204,0.5,kaiser(205,10.0613));
fvtool(b1,1,b2,1,b3,1);

これにより、次が生成されます。 http://www.4shared.com/photo/sZunQTHJ/1_online.html

次に、「分析」メニューに移動して「サンプリング周波数」を選択し、サンプリング周波数を入力します。フィルターごとに。結果は次のとおりです。

http://www.4shared.com/photo/sZunQTHJ/2_online.html

2 番目と 3 番目のフィルターの応答が繰り返されるため、あまり良くありません。最初のフィルターの応答は良好で、0 から 256/2=128 Hz まで変化します。2 番目と 3 番目のフィルターの応答を 64/2=32 と 32/2=16 にしたいと考えています。それぞれ。

だから私は手動でそれをやろうとしました、

%Digital filter:
fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726));  b1(end+256)=0;
b2 = fir1(40,0.5,kaiser(41,7.85726));   b2(end+448)=0;
b3 = fir1(204,0.5,kaiser(205,10.0613)); b3(end+480)=0;

%Filters Response
n=1024;
w = logspace(-1,2,n);

digi_1 = freqz(b1,1,n,fs1); semilogx(w,20*log10(abs(digi_1)),'Color','k'); hold on
digi_2 = freqz(b2,1,n,fs2); semilogx(w,20*log10(abs(digi_2)),'Color','b'); hold on
digi_3 = freqz(b3,1,n,fs3); semilogx(w,20*log10(abs(digi_3)),'Color','r'); 
axis ([0.1 128 -140 10])

ここでは、freqz を使用して、フィルターの分子と分母、ポイント数 n、およびサンプリング周波数を指定します。fs。問題は、サンプリング周波数の有無にかかわらず、Matlab が変更を行わないように見えることです。つまり、何も変更しない場合です。

したがって、誰かが助けたい場合、彼/彼女は私を助​​けてくれるかfvtoolsfvtools.

4

3 に答える 3

1

2 番目の 2 つのフィルターの選択が気に入らfir1ないようです。Wnを減らしてみてくださいWn

EDIT これがより明確になることを願っています。混乱して申し訳ありませんが、もともとWnはスケーリングが異なると思っていました。

そうですn、フィルターの長さを指定し、それは順序です。フィルターの次数が高いほど、数値が不安定になる可能性が高くなります。Mathworks のドキュメントでは、次のように呼びかけています。

b = fir1(n,Wn,window)

それから

n 次ローパス FIR フィルターの n+1 係数を含む行ベクトル b を返します。これは正規化されたカットオフ周波数 Wn を持つハミング ウィンドウ ベースの線形位相フィルターです。出力フィルタ係数 b は、z の降べきの順に並べられます。

Wn は 0 ~ 1 の数値で、1 はナイキスト周波数に対応します。

だから、あなたは最初のフィルターです:

% sampling frequency 256 Hz
b1 = fir1(52,0.25,kaiser(53,7.85726));

うまくいきます!一方、次の 2 つ

% sampling frequency 64 Hz
b2 = fir1(40,0.5,kaiser(41,7.85726));
% sampling frequency 32 Hz
b3 = fir1(204,0.5,kaiser(205,10.0613));

定期的な応答を表示します。これは、ある種の数値的な問題を示しています。これらのフィルター/ウィンドウを作成するときに警告はありますか? Mathworks のドキュメントでは、カイザー ウィンドウの仕様について次のように示されています。

カイザー仕様

ここで、alpha は阻止帯域での減衰の dB です。この値はおそらく高すぎますか? この値を緩和してみて、フィルタが期待どおりに動作するかどうかを確認してください。

于 2013-06-26T23:14:45.800 に答える
1

わかりました、これは実際には友人の解決策ですが、知識を共有するためにここに投稿します.

基本的に私のコードの問題は、x 軸のポイントを自分で定義していることです ( w = logspace(-1,2,n);)。これは、freqz から返される y 軸のポイントと何らかの形で互換性がありません。実際には、freqz は y と x aisx ポイントの両方を返すため、それよりもむしろ、freqz から返された x 軸のポイントを単純に使用する必要がありました。

したがって、以下の唯一の変更点は、w が手動で定義されるのではなく、freqz から使用されることです。

%Digital filter:
fs1=256; fs2=64; fs3=32;                                                   % Sampling frequencies.
b1 = fir1(52,0.25,kaiser(53,7.85726));%32                                  % Defining filter 1 parameters
b2 = fir1(40,0.5,kaiser(41,7.85726)); %16                                  % Defining filter 2 parameters
b3 = fir1(204,0.5,kaiser(205,10.0613));%8                                  % Defining filter 3 parameters

n=1024

[h1,w1] = freqz(b1,1,n,fs1); fig1=semilogx(w1,20*log10(abs(h1)),'Color','k'); hold on
[h2,w2] = freqz(b2,1,n,fs2); fig2=semilogx(w2,20*log10(abs(h2)),'Color','b'); hold on
[h3 w3] = freqz(b3,1,n,fs3); fig3=semilogx(w3,20*log10(abs(h3)),'Color','r'); 

w (x 軸のポイント) を手動で定義しようとした理由は覚えていませんが、それだけです。

于 2013-07-02T03:55:30.133 に答える
1

これを試して

hd1 = dfilt.dffir(b1);
hd2 = dfilt.dffir(b2);
hd3 = dfilt.dffir(b3);

h = [hd1 hd2 hd3];
freqz(h);

EDIT 1 実際には、これにより元のステートメントと同じ問題が発生する可能性があります...ちょっと待ってください...更新が確認されました。します。

EDIT 2
代わりにこれを試してください:

fs を使用してフィルターをビルドします。

fs1 = 256;
fpass = .4*fs;
fstop = .5*fs;
band_limits = [fpass fstop];
band_type = [1 0]; % 0 = stop, 1 = pass
ripple_dB = .1; % ripple mag
stop_db = -60; % stopband attenuation
dstop = 10^(stop_db/20);
dpass = abs(1-10^(ripple_db/20/2));
dev = [dpass dstop]; % ripple spec
c1 = kaiserord(band_limits,band_type,dev,fs1,'cell'); % kaiserwindow builder 
b1 = fir1(c{:}); % filter spec'd to window

etcetera、次に... コードの最初のブロック ( h = [hd1 hd2 hd3]) を実行し、freqz を呼び出すと、サンプリング周波数を正規化するだけで、すべてが期待どおりに表示されるはずです。

これはおそらく長い解決策です。おそらく、各フィルターのパラメーターを変更してサンプリングウィンドウに「整形」できるようにfvtoolする方法があります。freqz

EDIT 3 実際には、デフォルトの「正規化された頻度」ビューで十分です。

fs1 = 256 Hz の場合、サンプルあたり、2π = 256 サンプル。π は 128 サンプルです。これはfvtool -> View -> Analysis Parameters ... -> [x] Normalized Frequency、フィルタ 1 の Fs を入力した後に に移動することで確認できます。カットオフが、指定した 1/4 2π にあることがわかります。それが役立つことを願っています。

于 2013-06-27T18:55:56.987 に答える