2017-02-28 8 views
2

vDSP_biquad関数を1極フィルタとして使用したいと考えています。vDSP_biquadを1極フィルタとして使用する

私の一方の極フィルタは次のようになります。これは一方の極には素晴らしい作品が、もちろん私が使用したい理由である、最適化されていない

b1 = exp(-2.0 * M_PI * (_frequency/sampleRate)); 
    a0 = 1.0 - b1; 

output[i] = onePole->z1 = input[i] * onePole->a0 + onePole->z1 * onePole->b1; 

それをスピードアップするためにフレームワークを加速する。

vDSP_biquadはBiquad実装のダイレクトフォームIIを使用しているため、係数を1ポールフィルタとして使用できるように設定する必要があります。 https://en.wikipedia.org/wiki/Digital_biquad_filter#Direct_form_2

filter->omega = 2 * M_PI * freq/sampleRate; 
filter->b1 = exp(-filter->omega); 
filter->b0 = 1 - filter->b1; 
filter->b2 = 0; 
filter->a1 = 0; 
filter->a2 = 0; 

ただし、これは1つの極フィルタとしては機能しません。 (biquadの実装はうまくいきますが、他の多くのフィルタタイプに使用していますが、これらの係数は必要な効果がありません)。

私は間違っていますか?

加速器などを使用して1極フィルタを最適化する他の方法についても聞いてみましょう。

答えて

2

in the Apple docsは次のとおりです。あなたの上記のコードで

y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2]

、次の2つの入力前にあるb1を使用しています。 1極の場合は、以前の出力y[n-1]を使用する必要があります。

だから私はあなたが欲しい係数があると思います:

a1 = -exp(-2.0 * M_PI * (_frequency/sampleRate))

b0 = 1.0 + a1

+0

感謝。整理するのに1分ほどかかりましたが、小さな誤りがあります。ここではa1は負であるため、b0 = 1.0 + a1 – olynoise

+1

@olynoiseである必要があります。 – Taylor

関連する問題