Entwerfen eines Butterworth-Filters in Matlab und Erhalten von Filterkoeffizienten [a.b] als Ganzzahlen für den Online-Verilog-HDL-Code-Generator

3 answers
  • Die "gebrochenen Bits" sind die Anzahl von Bits in einem Bus, die Sie zur Darstellung des gebrochenen Teils einer Zahl (z. B. die 0,75 in 3,75) zugewiesen haben.

    Angenommen, Sie haben einen digitalen Bus mit einer Breite von 4 Bit. Welche Zahl stellt 1001 dar? Es könnte "9" bedeuten, wenn Sie es als positive ganze Zahl behandeln (2 ^ 3 + 2 ^ 0 = 8 + 1 = 9). Oder es könnte in der Zweierkomplement-Notation -7 bedeuten: (-2 ^ 3 + 2 ^ 0 = -8 + 1 = -7).

    Wie sieht es mit Zahlen aus, die einige Brüche enthalten, dh "reelle" Zahlen? Reelle Zahlen können in Hardware als "Festkomma" oder "Fließkomma" dargestellt werden. Es sieht so aus, als würden diese Filtergeneratoren einen festen Punkt verwenden.

    Zurück zu unserem 4-Bit-Bus (1001). Lassen Sie uns einen binären Punkt einführen, also erhalten wir 1.001. Dies bedeutet, dass nun die Bits auf der rechten Seite des Punkts verwendet wurden, um Ganzzahlen zu erstellen, und die Bits auf der linken Seite, um einen Bruch aufzubauen. Die durch einen auf 1.001 festgelegte Zahl ist 1,125 (1 * 2 ^ 0 + 0 * 2 ^ -1 + 0 * 2 ^ -2 + 1 * 2 -3 = 1 + 0,125 = 1,125). In diesem Fall verwenden wir 3 der 4 Bits im Bus, um den Bruchteil einer Zahl darzustellen. Oder wir haben 3 gebrochene Bits.

    Wenn Sie also eine Liste von reellen Zahlen wie oben haben, müssen Sie jetzt entscheiden, wie viele gebrochene Bits Sie darstellen möchten . Und hier ist der Kompromiss: Je mehr gebrochene Bits Sie verwenden, desto näher können Sie die gewünschte Anzahl darstellen, aber je größer Ihre Schaltung sein muss. Und je mehr weniger Bits Sie verwenden, desto mehr weicht der tatsächliche Frequenzgang des Filters von dem ab, den Sie zu Beginn entworfen haben!

    Und um alles noch schlimmer zu machen, Sie möchten einen Infinite Impulse Response (IIR) -Filter erstellen. Diese können tatsächlich instabil werden, wenn Sie nicht genügend gebrochene und ganzzahlige Bits haben!

    01 March 2012
    Marty
  • Marty hat sich also gut um die Bitsfrage gekümmert. Auf dem Filter selbst, denke ich, werden Sie wahrscheinlich eine Warnung oder Beschwerde von Matlab über schlecht skalierte Koeffizienten erhalten? Wenn ich den Filter plottiere, ist von scipy nicht Matlab, aber es ist wahrscheinlich sehr ähnlich.

    Entwerfen eines Butterworth-Filters in Matlab und Erhalten von Filterkoeffizienten [a.b] als Ganzzahlen für den Online-Verilog-HDL-Code-Generator

    Was 100 dB niedriger ist am Durchlassbereich! Vielleicht möchten Sie also sicherstellen, dass Sie einen kleineren Order-Filter benötigen, der Ihnen bei der Implementierung trotzdem helfen wird. Wenn ich zu einem Filter 6ter Ordnung komme, bekomme ich keine Beschwerden mehr über schlechte Koeffizienten. Versuchen Sie es vielleicht, die Reihenfolge zu reduzieren und zu prüfen, ob sie Ihren Anforderungen noch entspricht.

    01 March 2012
    macduff
  • Wie bereits erwähnt, ist es am besten, die Summe der Abschnitte zu verwenden, dh den Filter höherer Ordnung in kaskadierte Filter zweiter Ordnung aufzuteilen. Die aktualisierte Frage enthält die SOS-Matrix. Verwenden von diesem Code und einem Beispiel hier Das Python-Objekt kann zum Generieren der einzelnen Abschnitte verwendet werden.

    In matlab

     save SOS
     

    In Python

     import shutil
    import numpy
    from scipy.io import loadmat
    from siir import SIIR
    
    matfile = loadmat('SOS.mat')  
    SOS = matfile['SOS']
    b = numpy.zeros((3,3))
    a = numpy.zeros((3,3))
    section = [None for ii in range(3)]
    for ii in xrange(3):
        b[ii] = SOS[ii,0:3]
        a[ii] = SOS[ii,3:6]
    
        section[ii] = SIIR(b=b[ii], a=a[ii], W=(24,0))
        section[ii].Convert()  # Create the Verilog for the section
        shutil.copyfile('siir_hdl.v', 'iir_sos_section%d.v'%(ii))
     

    Weitere Informationen zu Festpunkten hier

    02 April 2012
    num1