Wie kann man mit dem MSP430F5438 Audio bei Nyquist-Frequenz abtasten?

Ich möchte:

  1. Geben Sie eine analoge Audiospur ein

  2. Konvertieren Sie ihn mit dem Mikrocontroller-ADC in einen digitalen Ausgang

  3. Lassen Sie dann die Zeitgeber der Mikrocontroller/Platinen die Daten in ausgewählten Intervallen abtasten

  4. Resampeln Sie die „gesampelte Audiospur“ mit dem doppelten Inhalt der höchsten Frequenz

  5. Konvertieren Sie es als perfekte Rekonstruktion der ursprünglichen Audiospur wieder in analog

Mit der Fourier-Analyse bestimme ich die höchste Frequenz, mit der ich den Track abtasten werde.

Es klingt einfach genug und geradlinig, aber was ich brauche, ist, dies in C zu programmieren und meinen MSP430-Chip / Experimentierplatine zu verwenden, um den Track zu sampeln. Ich werde Texas Instruments CCS und Octave zum Programmieren und Debuggen verwenden. Ich verwende das Experimentierboard MSP430F5438 .

Ist C die richtige Sprache dafür? Kann ich Beispiele dafür bekommen, wie man den Track mit C auf der Nyquist-Frequenz abtastet? Welcher Code in C weist das Board an, die ADC-Komponente zu verwenden? Und alle empfohlenen Informationen, die ähnlich sind oder mir bei diesem Projekt helfen werden.

Eine wirklich coole Möglichkeit, dies zu tun, besteht darin, ein grobes PSD-Meter mit einer Audioweiche zu erstellen und die Abtastfrequenz auf den minimalen Frequenzbereich einzustellen, der einen Schwellenwert erreicht. Das ist schweres Hardware-Design, aber das macht es cool! Beachten Sie, dass es dem Oversampling immer noch unterlegen wäre.
Interessante Überlegung, wie man das anstellt. Ich werde es mir ansehen und sehen, ob es mehr Arbeit ist, als nur die Daten zu überabtasten.
@Martin, das ist definitiv mehr Arbeit! ;)
Was denken Sie, wie viel Arbeit ein ADC, ein Oversampling-Prozess und dann ein DAC in c erfordern würde?
ADC und DAC können Hardware-Peripheriegeräte sein, sodass das Mikro nichts anderes tun muss, als auf ADC-Interrupts zu warten, um Werte aus den ADC-Registern zu lesen, oder auf Timer-Interrupts, um Werte in die DAC-Register zu schreiben – es ist die FFT, die ihm den Atem rauben kann. Es lohnt sich zu lernen, wie man einen FFT-Algorithmus (einschließlich der Suche nach Alternativen) für Zyklen und Speicher optimiert, während man innerhalb seiner Anforderungen bleibt.
Wie wäre es mit diesem Gedanken, nur das Board für den ADC und DAC zu verwenden (da ich bereits den Beispielcode habe) und dann den DSP-Prozess mit meinem Computer durchzuführen, würde das richtig funktionieren?
Sie müssten die Daten zu und von Ihrem Computer mit einer seriellen Schnittstelle oder mit einem externen USB-Chip (FTDI usw.) übertragen und empfangen, was in der Nähe von 50 kHz kein Problem darstellt, aber übermäßig kompliziert erscheint. Wenn Sie einen PC verwenden können, warum sollten Sie ihn nicht alles erledigen lassen und ihn einfach an die Audioeingangs- und Line-Out-Buchsen anschließen?
@Martin, wenn dir eine Antwort mehr als andere geholfen hat, eine Entscheidung zu treffen, könntest du vielleicht erwägen, sie zu akzeptieren.

Antworten (5)

Sie können Ihr gesamtes Projekt auf einem Desktop-PC durchführen. In der Tat, wenn ich es tun müsste, würde ich mit dem Desktop beginnen:

  1. eine .wav-Datei wird bereits mit einer hohen Frequenz gesampelt, oft 44100 oder 48000 Hz.
  2. Die Bestimmung der höchsten Frequenz kann mit einer FFT erfolgen. Für das Prototyping würde ich FFTW verlinken .
  3. Das Downsampling auf eine beliebige Frequenz ist etwas schwierig, da das Downsampling eine Tiefpassfilterung beinhaltet. Sie müssen für jede Frequenz einen Filter einrichten. Schauen Sie sich libsamplerate an und sehen Sie, wie es eine SINC-Funktion einrichtet, gegen die sich falten lässt.
  4. Die Rückwandlung zur ursprünglichen Abtastrate erfordert einen weiteren Tiefpassfilter. Siehe nochmal libsamplerate.

Ich glaube, ich würde dies in mehreren Durchgängen implementieren, um das Debuggen zu erleichtern:

  1. Bringen Sie zuerst alles in Matlab oder Octave zum Laufen. Octave verfügt über Bibliotheken für die gesamte Filterung und Fourier-Analyse.
  2. Bringen Sie alles in C auf dem PC zum Laufen und verknüpfen Sie FFTW und libsamplerate für das Downsampling / Upsampling.
  3. Schreiben Sie den C-Code mit Variablentypen mit expliziter Breite um (z. B. int16_t anstelle von „short“) und ersetzen Sie FFTW und libsamplerate durch eigenen Code, sodass er eigenständig kompiliert wird.
  4. Schreiben Sie in C für den MSP430 oder welchen DSP Sie auch immer haben, Interrupt-Routinen, um Daten auf dem ADC abzutasten und auf dem DAC auszugeben. Testen Sie, ob dies funktioniert, indem Sie einfach von der Eingabe zur Ausgabe gehen.
  5. Nehmen Sie den Arbeitscode aus Schritt 3 und kompilieren Sie ihn für den MSP430 oder was auch immer. Fügen Sie es dann in den Arbeitscode aus Schritt 4 ein, um mit den abgetasteten Daten zwischen ADC und DAC zu arbeiten.

Dies mag wie viele Schritte erscheinen, aber es ist viel wahrscheinlicher, ein funktionierendes Ergebnis zu erzielen, als alles in einer riesigen MSP430-Anwendung heldenhaft zu codieren und dann zu versuchen, es auf dem Entwicklungsboard zu debuggen.

Wie würde ich dann Nyquist verwenden oder es überabtasten? ADC ist kein so großes Problem, weil sie Beispielcode geben, aber könnte ich den Sampling-Code nicht einfach in den bereits gegebenen ADC-Code patchen?
Ich weiß nicht, was Sie mit "Nyquist verwenden" meinen. Bitte erkläre.
Sampling mit 2x der höchsten Frequenz; obwohl ich denke, dass es am besten wäre, etwas mehr als zu sampeln (sagen Sie einfach 20000 Hz anstelle von 2 c der höchsten (unbekannten) Frequenz). Aber wie auch immer, was Sie sagen, ist, es zuerst herunterzuladen.
Es ist normalerweise besser, a priori zu entscheiden, welche die höchste Frequenz ist, die Sie handhaben müssen. Für Audio können Sie 20 kHz wählen, da dies ungefähr das obere Ende dessen ist, was die Leute hören können. Entwerfen Sie dann Ihr System danach: Für 20 kHz könnten Sie mit 48 kHz abtasten, sodass Ihr Abtastfilter 4 kHz zwischen Durchlass- und Sperrband hat, was das Entwerfen erleichtert.
Ja, das habe ich gesagt, nur um es zu überabtasten, da die höchste Frequenz in dieser Situation unbekannt ist. Wie soll ich den Sampling-Filter dann in C erstellen? Es wäre also so ADC -> Downsample -> Re-Resample mit dem neuen Sampling-Filter -> DAC (Rekonstruktion). Und ich nehme an, das Board nur für die ADC-Prozesse zu verwenden
Ich sprach über den (analogen) Abtastfilter vor dem ADC.
Oh, ok. Nur um es in einem Flussdiagramm darzustellen, wie würde der Prozess für den gesamten Prozess vom Downsampling zum Resampling bis zur Rekonstruktion aussehen?
Es gibt viele Möglichkeiten, dies zu tun, aber ich würde ADC und DAC bei 48 kHz vorschlagen. Der Fluss ist also analoges Signal -> analoges Abtastfilter -> ADC -> Resample Down -> Resample Up -> DAC -> Rekonstruktion Analogfilter. Wenn Sie mit einem Audio-Codec sampeln, enthält dieser möglicherweise den Rekonstruktionsfilter auf dem Chip. "Resample Down" und "Resample Up" verwenden einen Tiefpassfilter. Tatsächlich wird dies derselbe Filter sein. Wenn Sie also den heruntergesampelten Stream für nichts anderes benötigen, können Sie "Resample Down-> Resample Up" durch "Tiefpassfilter" ersetzen und die gleiche Ausgabe haben.
Ich denke, der knifflige Teil wird darin bestehen, die analogen Abtastfilter und den Tiefpassfilter (Down- und Up-Sampling) zu erstellen. Würden Sie vorschlagen, dies in mehreren Schritten statt in einem großen Code zu tun?
@Martin, Audio > Anti-Aliasing > ADC > FFT > digitaler LPF > Dezimierung > DAC > LPF
Wenn Sie einen Audio-Codec verwenden, folgen Sie einfach dem Datenblatt und Sie haben den analogen Teil abgedeckt. Wenn Sie ein Devboard verwenden, stellen Sie sicher, dass es für die Audioverarbeitung ausgelegt ist (es verfügt über eine Eingangs- und Ausgangsbuchse) und dass das Board die analogen Dinge für Sie abdeckt. Der Tiefpassfilter muss von der vollen abgetasteten Bandbreite (24 kHz, wenn bei 48 kHz abgetastet) auf die Bandbreite gehen, die für Ihr Signal "notwendig" ist. Es gibt gute Webressourcen zum Entwerfen eines digitalen Tiefpassfilters.
Ja, das Entwicklungsboard, das ich gerade habe, verfügt über die gesamte erforderliche Hardware für tatsächliche Audio-DSP-Prozesse. Ich habe den Link im Hauptpost zu meinem Board, wenn Sie es sehen möchten, und gibt Beispiel-DAC- und ADC-Code für den Mikrocontroller. Das Hauptproblem ist also der analoge Filter, wenn ich den digitalen Tiefpassfilter online finden kann.
Machen Sie sich keine Sorgen um den analogen Filter. Ihr Entwicklungsboard hat es eingebaut.
Ich habe diesen FFT-Filer online gefunden pastebin.com/39zN9phE , ist diese Überschrift auf dem richtigen Weg
Nein, das ist nicht hilfreich. Ehrlich gesagt bin ich über den Zweck Ihres Projekts verwirrt, da ein erfolgreiches Ergebnis bedeutet, dass die Ausgabe mit der Eingabe identisch ist. Dasselbe gilt aber auch für ein Stück Draht.
Es soll nur die Wirkung von Nyquist-Raten-Sampling, Über- und Unterabtastung mit einem Mikrocontroller zeigen, aber es stellt sich als viel komplizierter heraus, als ich erwartet hatte.
Ich schlage vor, Sie führen Ihre DSP-Experimente auf Ihrem Desktop mit Octave oder Matlab durch. Und beginnen Sie mit "Blink the LED" auf dem Mikrocontroller. Machen Sie sich sowohl mit "DSP" als auch mit "Mikrocontroller" vertraut, bevor Sie "DSP auf Mikrocontroller" versuchen.
Wie schwer wäre dsp auf dem Computer, wenn man das Board komplett vergisst. Das ganze Ziel meines Projekts ist es, die Auswirkungen von Nyquist, Over-Under-Sampling und Rekonstruktion einer Audiospur zu untersuchen.
DSP auf dem Computer ist relativ einfach. Octave wird Funktionen haben, um eine Audiodatei zu laden und abzuspielen, und jede Art von Manipulation, die Sie sich vorstellen können. Sie können sich frei auf die Mathematik konzentrieren.
Also wird es die dsp-Funktionen für Over- und Undersampling haben? Gibt es spezielle DSP-Bibliotheken für Oktaven oder ist alles vorhanden?
octave-forge hat die vom Benutzer beigesteuerten Bibliotheken. Es gibt wahrscheinlich Funktionen, um das Sampling durchzuführen, aber wenn Sie versuchen, es zu lernen, sollten Sie Ihre eigenen schreiben.
Hey, Mark, du warst eine Menge Hilfe, aber das ist die ganze Zeit, die ich im Moment habe. Kann ich Sie bei weiteren Fragen irgendwie kontaktieren?
@Martin, du solltest seine Antwort positiv bewerten!
Gerade registriert
Stellen Sie einfach Fragen hier, Sie werden viel Hilfe bekommen. Stöbern Sie in der Zwischenzeit auf dspguru.com und lesen Sie mehr über die Abtastratenkonvertierung. dspguru.com/dsp/faqs/multirate/resampling

Sie müssen das Familienhandbuch und das Datenblatt verwenden - hier zu finden. Es wird Ihnen sagen, wie Sie den ADC einrichten und einige grundlegende Beispiele geben, außerdem hat TI Beispielcode für die MSP430-Chipreihe, die ADC10- und ADC12-Beispiele enthält.

Ich konnte den Beispielcode von denen, die ti Ihnen gibt, nicht finden.
Versuchen Sie, Ihren Chip hier zu finden: focus.ti.com/mcu/docs/…
Ich habe versucht, das Beispiel durchzusehen, aber nichts Nützliches gefunden :(
Sie werden keinen sofort einsatzbereiten Code finden, der für Ihr Projekt funktioniert, aber er sollte Ihnen einen guten Ausgangspunkt bieten, um mit dem Codieren zu beginnen. Versuchen Sie es mit msp430x54xA_adc12_05.c (ADC12, Using an External Reference) und msp430x54xA_adc12_07.c (ADC12, Repeated Single Channel Conversions) aus slac375a.zip.
ok wird aussehen, und jemand hat diesen Nyquist-Sampling-Code vorgeschlagen. programmers.stackexchange.com/questions/29991/… Ihre Gedanken? siehe Antwort 2.
Dieser Mustercode ist ein guter Anfang. Wenn Sie spezifische Code-Fragen zu Ihrem Board haben, können Sie auch www.43oh.com besuchen, dort gibt es in den Foren viele msp430-bezogene Codes und Projekte.
Ja, ich war schon einmal mit dieser Seite verlinkt, jsolarski ist trotzdem da. Ich kann mich per E-Mail mit Ihnen in Verbindung setzen. Sie scheinen eine Menge darüber zu wissen. Wäre großartig für zukünftige Fragen, die ich haben könnte.
Auf jeden Fall, verwenden Sie das Kontaktformular auf meiner Website justinstech.org/contact-me. Ich werde in den nächsten 24 Stunden mit meiner E-Mail-Adresse antworten.

Sie werden die Dinge viel einfacher finden, wenn Sie einen richtigen DSP verwenden, ich würde einen dsPIC verwenden. Microchip verfügt über FFT-Bibliotheken.

Wie viel kosten die dsPICs? Können Sie mir Vorschläge machen?
Es hängt vom Chip ab, es könnte <$2 sein. Siehe die Microchip-Website.
Was brauche ich für ein Experimentierboard, damit ich eine Verbindung zu meinem Computer herstellen kann?
Ich würde eine kleine Leiterplatte entwerfen.
Es wäre toll, wenn Sie mir einen Link zu einem Board empfehlen könnten, das für mein Projekt gut wäre. Ich habe auch gehört, dass Sie Daten in Matlab simulieren können, wodurch die Notwendigkeit eines Boards entfällt.
Sie könnten eine der Microchip-Platinen verwenden. Siehe Website.
Irgendwelche Empfehlungen aber welche?
Es hängt von Ihren Anforderungen ab. Sie sollten in der Lage sein, etwas Passendes für sich zu finden.
geh mal schauen.

Vielleicht möchten Sie sich das DSC-Starter-Kit ansehen . Es bietet Ihnen die gesamte Software und Hardware, die Sie für den Einstieg in die Audioaufzeichnung auf einem Mikrocontroller benötigen. Es hat auch einige Beispielprogramme.

DFT ist etwas schwieriger, aber es gibt vorgefertigte Bibliotheken dafür. Das Problem besteht darin, einen freien zu finden und sicherzustellen, dass Sie über genügend RAM verfügen, um alle erforderlichen Berechnungen durchzuführen.

Es ist weniger Audioaufnahme, mein aktuelles Board als eine vorgefertigte Rekodiersoftware, es ist das Sampling der Daten, mit denen ich Probleme habe.
@martin Ich bin mir nicht sicher, bei welchem ​​​​Teil Sie Hilfe benötigen. Das Board, auf das ich verlinkt habe, hatte einen Code zum Beispiel. Wenn Sie wissen möchten, wie man eine AD-Konvertierung durchführt, lesen Sie einfach, was der Befehl im Datenblatt ist.
Ja, ich habe es jetzt gesehen, nachdem ich die Beispiele gründlicher gelesen habe, aber ich brauche hauptsächlich Hilfe beim Sampling-Prozess mit dem Nyquist-Theorem in C.
Was ich tun würde, ist, so schnell zu samplen, wie es die Hardware zulässt. Ich würde dann nach der höchsten Frequenz über einer bestimmten Schwelle suchen. Verdoppeln Sie das und verwenden Sie das dann für meine Abtastfrequenz.
Das ist, was ich denke, krank am Ende tun. programmers.stackexchange.com/questions/29991/… diese eine Antwort, wie man in Nyquist-Frequenz abtastet.
@ Martin Ich war mir ziemlich sicher, dass diese Methode nicht funktioniert. Ich ging voran und überprüfte mit einem Freund von mir und bestätigte, dass es nicht funktioniert. Sie versuchen, Aliasing zu vermeiden, und ein Mikrocontroller kann nicht wissen, ob Sie Aliasing haben oder nicht. Sie müssen immer mit Oversampling beginnen und es ein wenig beobachten. Dann können Sie eine Annahme über die Bandbreite Ihrer Eingabe treffen und auf dieser Grundlage abtasten.

Ein Programm kann nur Frequenzen mit halber Abtastrate erkennen. Es gibt zwei Möglichkeiten, damit umzugehen:

  1. Oversampling : Abtasten mit mehr als dem Doppelten der maximal möglichen Frequenz (z. B. 48 kHz > 2 x 20 kHz), dann Komprimieren der Daten durch Tiefpass (Dezimierung) bei der höchsten berechneten Frequenz.

  2. Unterabtastung : Abtasten Sie mit einer Mindestfrequenz und entscheiden Sie sich dann für eine Abtastung mit einer höheren Frequenz, basierend auf dem Leistungspegel in Ihrem höchsten berechneten Frequenzbin (FFT-Term). Wenn es über einem bestimmten Schwellenwert liegt, erhöhen Sie die ADC-Abtastfrequenz.

Der einzige Weg, um in Echtzeit erfolgreich zu sein, ist Oversampling , da Undersampling entweder das Resampling der Teile überspringen muss, die es bereits mit einer zu niedrigen Frequenz abgetastet hat, oder eine Wiederholung anfordern muss.

Das verlinkte Entwicklungsboard scheint für diese Anwendung teuer zu sein. Gibt es mehr zu Ihrem Projekt? Es enthält Codebeispiele für Audio-Sampling und -Verarbeitung: SLAC227 (siehe FFT.c).

Ich plane Oversampling als mein Hauptexperiment und zeige dann die Auswirkungen von Undersampling auf einer 3-Ton-Audiospur. Der Grund, warum ich mich für dieses Board entschieden habe, war 1) Es wurde vorgeschlagen, 2) Ich kann es in Zukunft für mehrere Anwendungen verwenden.