Forum: Digitale Signalverarbeitung / DSP / Machine Learning Frage zur Abtastraten Konvertierung


von Manfred M. (bittbeisser)


Angehängte Dateien:

Lesenswert?

Ich habe da mal eine Anfängerfrage zur Konvertierung von Abtastraten. 
Meine Anwendung arbeitet eigentlich durchgehend mit 8000Hz. Aber aus 
Bequemlichkeitsgründen hatte ich kürzlich eine sehr simple Funktion 
eingebaut, um 'auf die Schnelle' auch Dateien eines HW Recorders (Sony 
PCM-M10) direkt verwenden zu können.

Nach Milchmädchenrechnung ist das dann ein Dezimierungsfaktor von 
44100/8000=5.5125 (oder richtiger: 441/80).

Um den Aufwand gering zu halten habe ich da einfach ein FIR Filter 
genommen, und dann, abhängig vom Fehlerwert, alternierend jeden 6-ten 
oder 5-ten Wert zurück geliefert. Das funktioniert auch grundsätzlich. 
Den dadurch entstehende Jitter verkraftet meine Anwendung problemlos.

Aber das neue Signal hat beim Mithören im Lautsprecher ein leichtes 
Klingeln im Hintergrund, was mich veranlasst hat mir mal das Spektrum 
anzusehen. Dabei habe ich festgestellt das da neue Signalanteile 
entstanden sind. Zu meiner Überraschung kann mein Morsedecoder auch mit 
diesem Signal noch etwas anfangen, obwohl der Pegel schätzungsweise 30 
dB niedriger ist.

Das diese Alias Frequenzen auftreten überrascht mich nicht, aber ich 
kann diese rechnerisch nicht nachvollziehen. Das eigentliche Signal hat 
eine Frequenz von etwa 767Hz und die niedrigsten Alias Frequenzen liegen 
bei ca. 3133Hz und 3313Hz.

Wie kommen diese rechnerisch zustande? Ich finde da keine zahlenmäßige 
Beziehung. Kann mich da jemand erleuchten?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

So vielleicht?

abs(8000*5 - 44100) - 767 = 3333

abs(8000*6 - 44100) - 767 = 3133


Gruss
WK

von Joe F. (easylife)


Lesenswert?

Stelle deinen Recorder doch einfach auf 48 Khz ein.

von Manfred M. (bittbeisser)


Lesenswert?

Danke. Da hat wieder mal das berühmte Brett zugeschlagen. Ich hatte 
immer von der falschen Seite angefangen.

> Stelle deinen Recorder doch einfach auf 48 Khz ein.
Da denkt man ja in der Eile nicht immer drann.

von Joe F. (easylife)


Lesenswert?

Manfred M. schrieb:
>> Stelle deinen Recorder doch einfach auf 48 Khz ein.
> Da denkt man ja in der Eile nicht immer drann.

Kann man sich angewöhnen ;-)

Andere Möglichkeiten:
- 44.1K File vorher mit einem guten Sampleratekonverter auf 48K bringen.
- TP Filter 2. Ordnung (fc 1 KHz) hinter deinen 
quick&dirty-Samplerateconverter, bringt dir deine Aliasfrequenzen um 
schätzungsweise 20 dB nach unten.

: Bearbeitet durch User
von Manfred M. (bittbeisser)


Lesenswert?

> - 44.1K File vorher mit einem guten Sampleratekonverter auf 48K bringen.
Da könnte ich dann aber auch gleich auf 8kHz konvertieren, was ich auch 
mit einigen Dateien gemacht habe.

Ist ja auch nur eine Notlösung. Wenn ich planen würde das regelmässig zu 
machen, sollte ich mich besser mit 'libsamplerate' beschäftigen.

> - TP Filter 2. Ordnung (fc 1 KHz) ...
Dann lieber ein IIR 4. Ordnung für fc 2~2.5kHz dann könnte ich auch noch 
RTTY verarbeiten.

Aber ich wollte ja nur Klarheit über die Zusammenhänge haben.

von Audiomann (Gast)


Lesenswert?

Auch bei einer ganzzahligen Abtastrate kann man nicht einfach was 
weglassen, wie Du das machst.

von Manfred M. (bittbeisser)


Lesenswert?

Nicht? Ich dachte immer das es ausreicht, wenn man vorher sicher stellt, 
das alle Frequenzen oberhalb der halben Ziel Abtastrate ausreichend 
bedämpft werden. Und das ich ein FIR Filter einsetze hatte ich anfangs 
auch (zu?) kurz angedeutet. Knickt bei 2500Hz ab und verläuft ab 4000Hz 
und -50dB horizontal weiter. Ich dachte das reicht.

von J. S. (engineer) Benutzerseite


Lesenswert?

Für einfache Ansprüche sollte das reichen. Mitunter bedämpft man es aber 
direkt konkret auf die zu übertragenden Frequenzen. Das ist nicht 
automatisch fs/2.

Das mit dem wechselnden Raten am Ausgang ist keine gute Idee:

Auf diese Weise konvertierst Du keine Abtastraten sondern spielst einen 
integeren Datenstrom mit einer wechselnden Abtastrate ab, was 
logischerweise zu massiven Artefakten führen muss.

Praktisch modulierst Du dein Signal noch mit einem Rechteck. Bei 
Synthesizern macht man das, um das Signal zu scattern und zu verzerren 
:D

: Bearbeitet durch User
von Manfred M. (bittbeisser)


Lesenswert?

> Für einfache Ansprüche sollte das reichen.
Ich sagte ja bereits, das mein Morsedecoder damit keine Probleme hat.

> Das ist nicht automatisch fs/2.
Mein altes Funkgerät hat einen Frequenzgang, der irgendwo zwischen 
2500Hz und 2700Hz abfällt. Der Filter mit 64 Taps ist daher so 
berechnet, das die angegebene Sperrdämpfung bereits bei fs/2 erreicht 
wird. Zur Berechnung habe ich den Parks-McClellan Algorithmus in der 
Version von http://www.iowahills.com/A7ExampleCodePage.html verwendet.

> ... was logischerweise zu massiven Artefakten führen muss.
Die halten sich merkwürdigerweise in Grenzen.

Allerdings hatte ich jetzt auch versucht es "richtig zu machen", also 
mit Faktor 80 upsamplen und dann um 441 zu dezimieren. Durch einen 
anfänglichen Denkfehler hatte ich dann alle Artefakte am Ohr und mein 
Wasserfalldiagramm war voller Linien :-(

Aber wenn man es korrekt machen will, ist der Aufwand doch erheblich. 
Allein die Anzahl der Taps in den Filterstufen schreckt mich ab. Für 
eine Echtzeitanwendung (ist angestrebt) scheint mir das zu hoch.

von Joe F. (easylife)


Lesenswert?

Eine andere "dreckige" Möglichkeit wäre folgende:

immer 11 Eingangssamples (IN0 .. IN10) nehmen,
Ausgangssample 1 (OUT0) ist IN0
IN1 bis IN4 werden verworfen
Ausgangssample 2 (OUT1) ist (IN5 + IN6)/2
IN7 bis IN10 werden verworfen

Dabei kommt dann ein relativ verzerrungsfreies Signal heraus, allerdings 
ist die Samplerate nicht 8 KHz, sondern 8018,181818... Hz
Also ein Fehler von 0.23%

Die für die maximal interessante Frequenz von etwa 2500 Hz wird also zu 
2494 Hz.
Sollte für eine Frequenzerkennung unerheblich sein.
Das ganze ist natürlich nur auf eine Datei mit endlicher Länge anwendbar 
und nicht auf einen Echtzeit-Stream.

: Bearbeitet durch User
von Manfred M. (bittbeisser)


Lesenswert?

Das ist auch eine interessante Variante. Das Ergebnis ist wohl etwa so 
als hätte ich um Faktor 2 erhöht um dann nur jeden 11-ten Wert zu 
verwenden, nur das das Aliasfilter auf der niedrigen Frequenz arbeiten 
kann.

> Das ganze ist natürlich nur auf eine Datei mit endlicher Länge anwendbar
> und nicht auf einen Echtzeit-Stream.
Das sehe ich jetzt nicht so. Ich sehe keinen Grund, warum so ein System 
nicht mit dieser krummen Abtastrate arbeiten könnte (wenn man von der 
Soundkarte einmal absieht). Ich hatte kürzlich ein Programm gesehen, das 
mit 612.5Hz arbeitet. Du gehst wahrscheinlich davon aus, das ich das 
Ergebnis dann der Soundkarte dann als 8000Hz verkaufe.

Allerdings müsste ich da bei meinem Wasserfall Spektrogramm einiges 
ändern, was ich unbequem finde. Ich benutze Mausklicks in diese Diagramm 
zur Frequenzselektion.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.