PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sprachaufzeichnung und Wiedergabe


Nasenbaer
2007-06-17, 16:54:46
Hi,
hier gehts mir nicht um die Verwengung irgendeiner API sondern wie man das selbst macht.
Wir müssen in einem Projekt mit einem Mikrocontroller (C167) Sprachsignale digitalisieren, komprimieren und dann wieder ausgeben können.
Faktisch stehen uns dann nur Werte des ADCs zur Verfügung, die dann irgendwie fouriertransformiert werden müssen usw.

Das Problem dabei: Von uns hat keiner Ahnung von digitaler Signalverarbeitung. Ich hab mir die Einführung zum Versuch durchgelesen und halb wikipedia in Bezug auf FFT, DFT, Dirac-Impuls etc. durchgelesen.
Ich weiß jetzt, dass ich mit der FFT die Messwerte so umwandeln kann, dass ich danach die Fregenzen des Signals und ihre zugehörigen Amplitudenwerte habe.

Aber wie wende ich die FFT praktisch an? Im Netz findet man praktisch ausschließlich theoretische Betrachtungen und HowTo mit Beispiel.

Kann mir irgendwie bei meinem Problem helfen?

P.S.: Großartig Bücher wälzen bringt auch nicht, da wir nur 4 Wochen Zeit haben ein komplettes Programm dazu in ASM zu schreiben.

Nasenbaer
2007-06-18, 22:58:40
Kennt sich denn niemand hier mit Fouriertransformation aus? :(

Omnicron
2007-06-19, 19:43:16
Verschieden FTs in Pseudocode gibs im fxtbook (pdf skript mit vielen Algorithmen)
http://www.jjj.de/fxt/#fxtbook
In C++ dann wohl in diesem fxt package.

ethrandil
2007-06-20, 02:17:01
Hallo. Ich sag mal so - einen einfachen wav-verschnitt bekommt man glaube ich recht einfach, indem man einfach die werte des adc ausliest und richtig formatiert in eine Datei knallt.

Zum komprimieren ist ne FFT wohl nicht schlecht. zB kann man einfach wenig genutzte Frequenzbereiche weglassen beim komprimieren.
Dabei macht es wahrscheinlich Sinn, vorher das Signal durch einen Bandpassfilter zu jagen, der alles was nicht im Frequenzbereich von normaler Sprache liegt rausfiltert.

mfg
- eth

Monger
2007-06-20, 09:40:27
So würde ich das auch sehen. Wenn du an keiner Datenverarbeitung interessiert bist, sondern nur an speichern und wiedergeben, würde ich einfach den Datenstrom so aufzeichnen wie er reinkommt, und bei der Wiedergabe in gleicher Reihenfolge wieder rausballern. Den Rest sollte die Hardware machen.

Edit: um mal ein blödes Beispiel zu bringen - als das Grammophon erfunden wurde, hatte auch noch keiner eine Ahnung von Fouriertransformationen. Sie wussten nur, dass irgendwas in der Luft schwingt, und sie brauchten ein Medium was diese Schwingungen mitmacht, und bei Bedarf repliziert. Wie diese Schwingungen genau aussahen, wusste damals aber mit Sicherheit niemand. Im Endeffekt machst du das selbe.

pest
2007-06-20, 09:49:12
Also....:)

ich weiß nicht wie euer Kompressionsalgorithmus funktionieren muss,
wenns schnell gehen soll reicht eine ADPCM-Version.
Also lineare Prädikation und Quantisierung des Residuums.
Die andere Variante für einen verlustbehafteten Codec,
wäre mit der FFT über Blöcke von 256-1024 Samples eine Frequenzanalyse durchzuführen,
und mit einem einfachen psychoakustischen Model (z.B. MPEG-1)
die entsprechende Frequenz-Maskierung durchzuführen.
Als Transformation würde ich die MDCT empfehlen.

Monger
2007-06-20, 10:14:04
@pest: meinst du wirklich, dass man in vier Wochen mal so schnell eine verlustbehaftete Kompression sich selber hinfrickeln kann?

Das ALLERHÖCHSTE was man imho als Laie in der Zeit schaffen kann, ist ein Hoch- bzw. Tiefpass. Bei sowas sollte man die Erwartungen schön niedrig stecken.

pest
2007-06-20, 10:19:45
Die erste Variante ist rel. einfach (also ADPCM-Variante), vielleicht 30 Zeilen C.
Der Bandpass ist bei Sprachsignalen natürlich Pflicht,
hier mal nen Pseudo-Code

Fehler = Sample - Predikator (z.b. über LPC-10)
Quantisiere Fehler (z.b. auf konst. 4 Bits)
Kodiere quantisierten Fehler (z.b. Golomb-Rice Kodierer)

Gast
2007-06-21, 10:37:59
Die erste Variante ist rel. einfach (also ADPCM-Variante), vielleicht 30 Zeilen C.
Der Bandpass ist bei Sprachsignalen natürlich Pflicht,
hier mal nen Pseudo-Code

Fehler = Sample - Predikator (z.b. über LPC-10)
Quantisiere Fehler (z.b. auf konst. 4 Bits)
Kodiere quantisierten Fehler (z.b. Golomb-Rice Kodierer)
Die Rate an Fachausdrücken in diesen 3 Zeilen scheint mir verdächtig hoch. Erklär das alles mal jemandem der (noch) keine Ahnung von digitaler SigV hat. Das setzt ja praktisch schon den halben Oppenheim/Schafer voraus.

Trap
2007-06-21, 11:08:32
Die Rate an Fachausdrücken in diesen 3 Zeilen scheint mir verdächtig hoch. Erklär das alles mal jemandem der (noch) keine Ahnung von digitaler SigV hat.
Wenn man stattdessen Ahnung von statistischer künstlicher Intelligenz und Informationstheorie hat ist keiner der Begriffe neu.

Ich halte den Vorschlag für gut umsetzbar in 4 Wochen, inhaltlich versteckt sich hinter nichts davon etwas sonderlich kompliziertes.

Nasenbaer
2007-06-26, 21:22:17
So wollt mich auch mal wieder zu Wort melden.

Mein Problem ist, dass der Prozessor ein C167 (Infineon) ist und der nativ keine FPU besitzt. Deshalb fallen Sachen wie FFT oder DCT einfach schonmal aus. Zudem muss die Komprimierung in Realtime stattfinden, weil die Komprimierung dazu dienen soll die Aufnahmedauer mindestens zu verdoppeln. D.h. abspeichern und danach gemütlich komprimieren geht leider nicht.

Auf LPC10 bin ich auch schon im Netz gestoßen, genau wie auf ADPCM. Letzteres erachte ich für die einfachere Variante aber weiß noch nicht genau wie ich z.B. die Schätzfunktion bauen soll - da fehlen mir die kenntnisse über "typische signalverläufe".

pest
2007-06-26, 23:14:15
aber weiß noch nicht genau wie ich z.B. die Schätzfunktion bauen soll - da fehlen mir die kenntnisse über "typische signalverläufe".

fehler = sample[i] - sample[i-1]

oder

fehler = sample[i] - (2*sample[i-1] + sample[i-2])

oder

fehler = sample[i] - (gewichtung * sample[i-1])

die gewichtung kann man dann anhand des Fehlerverlaufs anpassen