PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DSP digitales Audiofilter



vohopri
23.02.2013, 07:30
Hallo,

Um mit meinen Elektronik Künsten noch besser auf einen aktuellen Stand zu kommen, plane ich, nach der MC Technik, auch in DSP ein zu steigen. Zur Zeit bin ich noch beim Suchen nach den Grundlagen. Meine Schulmathematik ist so eingerostet, dass ich all die wunderbaren Hochschulskripten im Netz nicht flüssig lesen und verstehen kann.

Also setze ich dort an, wo mir etwas geläufig ist. Als Erstes werde ich die DSP in bescheidenen Ansätzen mit LT Spice umsetzen. Da geht es nur darum, Verfahren zu testen, und noch nicht um die praktische Umsetzung
auf MC.

Als zukünftige praktische Anwendung kann ich mir vorstelle: Ein Tonfilter für meine Morse Aktivitäten auf Kurzwelle, ein Synchronfilter gegen Störungen für Sensoren, die mit Wechselspannung betrieben werden können und ein Filter für Lichtsignale, die von led zu Fotodiode übertragen werden.

Kampi
23.02.2013, 09:16
Hey,

vorletztes Jahr lief in der Elektor ein Audio DSP Kurs (mit Board und allem drum und dran).
Hier hast du mal den Link dazu (leider funktioniert im Moment wieder mal nur die Englische Seite -.-) vielleicht hilft dir das ja weiter :)

http://www.elektor.com/products/kits-modules/modules/110001-92-audio-dsp-course.1952755.lynkx

Hab mich damals auch mal ein bisschen aber nach zwei Artikeln aufgehört, weil mir das zu kompliziert war (wäre mit dem heutigen Wissensstand wahrscheinlich anders)

vohopri
23.02.2013, 12:39
Hallo Daniel,

danke für den Hinweis und den Link. Das schaut recht interessant aus.
Zur Zeit bleibe ich aber bei etwas einfacheren und vor allem weniger aufwändigen Dingen, die schneller zu sichtbaren Ergebnissen führen.

Ltspice, Soundkarte und atmega sind die Dinge, die mir einigermassen geläufig sind.

vohopri
23.02.2013, 16:20
Es wird manche überraschen, dass in ltspice und ähnlichen Programmen sehr einfach digitale Verarbeitung simulierbar ist. Das geht über mathematische Funktionen.

In den so genannten Behavioural Voltage Sources steht einiges an Mathe zur Verfügung.

Die wichtigste Funktion für dsp ist die delay Funktion und für ihre Anwendung verwende ich zunächst die Abweichung der Zeit vom Abtasttakt:

V=time - round(time*{Fs}-.5)/{Fs}
Das Ergebnis wird mit DEVt gelabelt und weiter Verarbeitet

V=round(delay(V(Xkont),V(DEVt))*127)/127
Damit haben wir ein Zeit- und Wertdiskretes Signal.

Damit sollte sich schon etwas anfangen lassen.

vohopri
27.02.2013, 18:28
Hallo,

Anschliessend hab ich mir eine Filter Funktion ausgedacht und mit LTspice umgesetzt. Die Details sind auf dem folgenden Screenshot erkennbar:
https://www.roboternetz.de/community/attachment.php?attachmentid=24681&d=1361987988
Für den Fall, dass das nicht so gut lesbar ist, poste ich hier noch die Netlist:
* G:\korfil\ltspice\diskret\Draft6.asc
B1 DEVt 0 V=time - round(time*{Fs}-.5)/{Fs}
B2 Xdig 0 V=round(delay(V(Xkont),V(DEVt))*127)/127
V1 Sin 0 SINE(0 1 {Fx})
B3 mean 0 V=v(xdig)+delay(v(mean),tx)*.9-delay(v(xdig),{tx/2})
B4 y 0 V=round(v(mean)/10*127)/127
B5 Xkont 0 V=(v(sin)+(rand({time*fs})-.5)*2)/2
V3 +5 0 5
XU1 N002 Ykont +5 -5 Ykont LM324
R1 N002 N001 10k
R2 N001 y 10k
C1 Ykont N001 3n9
C2 N002 0 3n9
V2 -5 0 -5
.tran 0 {tx*40} {tx*35}
* Frequenz des Sampling
.param Fs = 16k ts = {1/Fs}
*Frequenz des Eingangs
.param Fx = 1k tx = {1/Fx}
* SINE(0 1 {Fx})
* .tran {tx*10}
.lib LM324.sub
.backanno
.end


Zur Erklärung:
Ein Sinus Signal wird erzeugt, Rauschen wird dazu gemischt, das kontinuierliche Signal wird diskretisiert, dann digital gefiltert und schliesslich mit einem Smoothing Filter wieder der analogen Welt zurück gegeben.


- - - Aktualisiert - - -

https://www.roboternetz.de/community/attachment.php?attachmentid=24683&d=1361989577

Das Ergebnis ist schon mal gut an zu sehen, wie sich das wohl in Audio anhört?

vohopri
02.03.2013, 19:55
Audio hört sich sehr gut an, aber zunächst zeige ich mal einen Bode Plot von diesem Filter Verfahren.

https://www.roboternetz.de/community/attachment.php?attachmentid=24714&d=1362253532

Nachdem das Verfahren in ltspice gut funktioniert hat, habe ich es auf dem PC zur Verarbeitung von wav files implementiert.

xi:=x+128;
//memoTest.Lines.Add(inttostr(xi));
//xi:=xi div 2; // test OK Outputfile enthält die richtigen Daten 8 bit c2
//xo := (xi - xi3) div 2; // test OK das filtert schon mal ein wenig
//xi3:=xi2;xi2:=xi1;xi1:=xi;
xo:=round(xi-xi4+xs8*0.95);
//xo:= xi4; // war ein Test
xi4:=xi3;xi3:=xi2;xi2:=xi1;xi1:=xi;
xs8:=xs7;xs7:=xs6;xs6:=xs5;xs5:=xs4;xs4:=xs3;xs3:= xs2;xs2:=xs1;xs1:=xo;
// das geht jetzt gut, mit der Rekursion
//xo := round(sqrt(sqr(xo/40)+sqr(xs3/40))); // Betrag out = DC Impulse, OK
xo:=round(xo/40); // soundsignal out, OK
x:=xo-128; // out
processed.write(x,1);

vohopri
03.03.2013, 13:18
Anscheinend kann ich hier keine wav Files als Hörprobe hochladen. Darum zeige ich visuell die Signalverläufe der wav Files. Oben verrauschtes Morse Signal VVV, Mitte gefiltertes Signal und untendemoduliertes Signal, das sind die DC Impulse noch ohne Tiefpass und Flankenrückgewinnung.

https://www.roboternetz.de/community/attachment.php?attachmentid=24717&d=1362315692

Als Nächstes ist dann ein Programm zu schreiben, dass die Signale nicht von einem File liest und filtert, sondern von der Soundkarte und on the Fly gefiltert ohne nennenswerte Verzögerung auf dem Lautsprecher ausgibt. Es wird noch ein wenig dauern, bis ich das präsentieren kann, denn mein Zeitbudget ist knapp und der Soundkartenzugriff ist ein wenig aufwändiger.

Also lade ich ein, den hier aufgezeigten Weg zu diskutieren. Sicher gibt es auch andere hier, die Erfahrungen auf dem Gebiet beitragen können.

Kampi
03.03.2013, 13:48
Hey,

das sieht ja schon vielversprechend aus :)
Freue mich mehr davon zu hören.
Mit LTSpice habe ich leider noch nicht gearbeitet und von daher kann ich in erster Linie nur was mit den Bildern anfangen.
Mal schauen....vielleicht schreibe ich LTSpice noch auf meine ToDo Liste, dass ich es mir mal anschaue / damit arbeite :)

vohopri
04.03.2013, 20:54
Tiefpass und Schwellwert mit oder ohne Hysterese sind sehr einfach zu realisieren.

https://www.roboternetz.de/community/attachment.php?attachmentid=24729&d=1362430127

Aber eine sinnvolle Automatik, die die Schwellen festlegt, ohne in längeren Pausen Unsinn und Krach zu machen, das scheint eine Herausforderung zu werden. Irgend etwas mit Varianzanalyse könnte da helfen. Oder gibts noch andere Ideen?