Guten Tag,
ich habe mir diesen Code nach C# portiert und bekomme leider falsche
Ergebnisse für die Biquad Coeffizienten.
http://www.earlevel.com/main/2012/11/26/biquad-c-source-code/
Mein C# Programm liegt im Anhang.
Erstelle ich einen Peak Filter mit folgenden Eigenschaften ...
Sampling Freq: 48.000Hz
Corner Freq: 200Hz
Q: 1
Gain: -3
... erhalte ich diese Werte:
1 | a0 0,889160572865746
|
2 | a1 -0,620483385591525
|
3 | a2 0,351806198317308
|
4 | b1 -0,620483385591525
|
5 | b2 0,240966771183054
|
Gebe ich das Selbe hier online
(http://www.earlevel.com/main/2013/10/13/biquad-calculator-v2/) ein
erhalte ich andere Werte.
Wieder andere Werte erhalte ich wenn ich meinen identischen Filter mit
dem Analog Devices SigmaStudio generiere (siehe auch Screenshot)
1 | B0_VALUE 0.00914776714314553
|
2 | B1_VALUE 0
|
3 | B2_VALUE -0.00914776714314553
|
4 | A1_VALUE 1.97348037666768
|
5 | A2_VALUE -0.974156870921681
|
Somit drei völlig unterschiedliche Werte ... wer kann hier helfen?
Meine eigene Berechnungsroutine sieht so aus:
(für diejeingen die kein Visual Studio haben...)
1 | double norm;
|
2 | double V = Math.Pow(10, Math.Abs(peakGain) / 20.0);
|
3 | double K = Math.Tan(Math.PI * Fc);
|
4 |
|
5 |
|
6 | if (peakGain >= 0) { // boost
|
7 | norm = 1 / (1 + 1/Q* K + K* K);
|
8 | a0 = (1 + V/Q* K + K* K) * norm;
|
9 | a1 = 2 * (K* K - 1) * norm;
|
10 | a2 = (1 - V/Q* K + K* K) * norm;
|
11 | b1 = a1;
|
12 | b2 = (1 - 1/Q* K + K* K) * norm;
|
13 | }
|
14 | else { // cut
|
15 | norm = 1 / (1 + V/Q* K + K* K);
|
16 | a0 = (1 + 1/Q* K + K* K) * norm;
|
17 | a1 = 2 * (K* K - 1) * norm;
|
18 | a2 = (1 - 1/Q* K + K* K) * norm;
|
19 | b1 = a1;
|
20 | b2 = (1 - V/Q* K + K* K) * norm;
|
21 | }
|
Danke!!!
Gruß Bernhard