Hallo, ich habe folgendes Projekt: Ich möchte von einen mit dem Mikrofon aufgenommenen Ton die Frequenz ermitteln und dann weiterverarbeiten mit dem ATmega8/16/32. Der Ton entseht beim klopfen auf die Saite eines Tennisschlägers. Im Amhang hab ich mal den Frequenzgang einer "Klopfaunahme" mit dem PC dargestellt. Je nach Schläger(und dessen Bespannug) können Töne entstehen die von Minimum 400Hz bis Maximum 800Hz liegen(in der angehängten Datei liegt der angestrebte Wert bei 576MHz). Wie man aber auf dem Spektrum erkennen kann sind auch andere Frequenzen aufgenommen worden. Wie schaffe ich es nun diese eine Frequenz zu digitalisieren(in einem ATmega8/16/32)???? Mein erster Ansatz war: Mikrofon an Vorverstärker, das Signal filtern (bandpass von ca 400 bis 800Hz)und das Ganze an den NE555. Dieser erzeugt eine Rechteckspannung welche dann an einem IO-Port gelegt wird. Nun die Zeit einer Periode messen (flanke zu flanke)und man sollte die Frequenz erhalten. Ich weiß allerdings nicht ob dies auch wirklich funktioniert, vor allem ob man aus dem NE555 wirklich die entscheidende Frequenz ( im angehängten Spektrum bei 576Hz) bekommt oder ob noch diverse andre Freqeunzen überlagert sind am Ausgang....??? Oder gäbe es einen anderen Ansatz wie man dies bewerkstelligen könnte? Bitte um Hilfe! mfg tobi
Vielleicht ist hier was für dich bei: Beitrag "Stimm / Gesangsanalyse" In deinem Screenshot stehen eigentlich alle Infos drin um das zumindest grundlegend nachzuprogrammieren: Mit einem Hanningfenster (der Länge 4096?) in die Frequenzdomäne überführen und das Maximum auswählen. Wie schnell muss das sein (Verzögerung, Wiederholungen pro Sekunde), wie Genau muss das sein (1%, 10%, ...) ... und vielleicht kurz über Bildformate informieren
Mikrophon -> Verstärker -> ADC des AVRs -> FFT oder Görtzel-Filter -> Fertig. ? Für FFT gibts fertige AVR-Sourcen, einfach mal in die Codesammlung schauen. und für deine Frequenzen ist der AVR-Adc allemal schnell genug.
danke erstmal für die infos... problem: ich programmiere lediglich in assembler und das noch nicht allzulange. :) für mein erstes (großes ) projekt helfen mir euro anweisungen bis jetzt nur bedingt...leider :) sollte ich mich vorher lieber in c einarbeiten? oder ist das mit assembler ohne weiteres möglich? (für eine anfänger) mfg
ach ja: schnell muss das ganze überhaupt nicht sein! man will quasi einen schläger testen, startet die aufnahme, klopft auf den schläger, und wartet auf das ergebniss. Also geschwindigkeit ist völlig egal. Die auflösung hingegen sollte möglichst geanu sein, also eine Auflösung von 1Hz wäre wünschenswert!! mehr als 3 Hz dürfen esa ber nicht sein da sonst die weiter berabeitung nicht sinnvoll ist!!
Bei 400 Hz Bandbreite mit 1 Hz Auflösung wird's mit dem Speicher doch recht eng in einem AVR - auch in Assembler. Sollte aber gerade so machbar sein. Assembler ist halt was anstrengender. Ich empfehle folgendes Vorgehen: - Denk dir einen Algorithmus aus und prüfe, ob das von den Eckdaten (Speicherbedarf, Geschwindigkeit, etc.) überhaupt jemals in die Größenordnungen von einem AVR kommt. - Bring den Algorithmus in einer Hochsprache deiner Wahl erstmal ans Laufen (ich mache das üblicher Weise mit Java oder QuickBasic). Also mit 2 GB Speicher, double-Precision, und allem Luxus, den man sich vorstellen kann. - Wenn das schon nicht klappt -> Problem verändern oder nachlernen :) - Wenn's klappt -> Algorithmus zurechtstutzen: alles auf integer-Rechnung umstellen, Puffer auf das notwendige Minimum verkürzen. - Wenn's danach immer noch nicht in einen Mikrocontroller passen würde -> Back to Scratch - Wenn's passen würde: Step by Step in Assembler übersetzen und den µC damit füttern. Das Debuggen wird einfacher, da du einen funktionierende Version besitzt, mit der du abgleichen kannst. Das Vorgehen geht die größten Probleme nacheinander an, sorgt dafür, dass der Ruf von Assembler erhalten bleibt und spart dir hoffentlich einiges an Frustration ;) Hoffe, das hilft dir weiter.
hmmm...also danke dür die hinweise..nur: ich weiß nicht wie ich eine FFT überhaupt angehen soll, ich habe da einfach keine ahnung. Ich weiß lediglich dass die werte am ADC eingang mit einer bestimmten frequenz abgetaseet werden sollen. wie man dann weiter vorgeht???? keine ahnung. ich hab e bereits alle mögliche FFT sachen gelesen, sprich den code auch angeschaut, versteh es aber nicht. deswegen weiß ich auch nicht wie ich da weiter vorgehen soll. und JAVA oder so kann ich nicht programmieren. ich habe lediglich assembler und ein bischen c kenntnisse. :(
Naja... da es für deine Rahmenbedingungen wohl kaum fertigen Code gibt, wirst du dich wohl in Einiges reinarbeiten müssen - oder erstmal kleinere Brötchen backen. Fang statt der FFT erstmal mit einer normalen Fourier-Analyse an. Einfach das Ausgangssignal mit einem Sinus der zu testenden Frequenz multiplizieren und das arithmetische Mittel bilden (a). Dasselbe noch mal mit dem Cosinus (b). sqrt(a² + b²) liefert dir dann einen Wert, der proportional zur Amplitude ist. Das machst du dann mit alle Frequenzen und suchst dir den größten Wert. Das war jetzt die Kurzfassung ohne komplexe Zahlen, Optimierungen etc. in Umgangssprache :) Ich hoffe, das hilft dir ein wenig.
hey kai...das hilft mir schon...das probiere ich jetzt erst einmal aus und mal sehen was ich mir in den nächsten tagen u wochen dann aneignen kann. es eilt ja nicht mit dem gerät, ich mache es lediglich als hobby, möchte es aber sehr gerne erlernen. ;) mfg
Hallo, da ich auch keine richtige Ahnung von FFT usw. habe, hätte ich vielleicht folgende Idee: den Spectrum.Monitor greifen von elm-chan http://elm-chan.org/works/akilcd/report_e.html schauen, ob die Software prinzipiell verständlich aussieht und dann den (die) höchsten Werte, die zum Display zur Anzegeige gereicht werden, rauskramen und weiter benutzen. Hier im Forum gab es dazu auch noch was, finde ich aber gerade nicht. Gruß aus Berlin Michael
hallo, also ich hab mir jetzt selbst einen algorythmus überlegt...müßte hinhauen. problem: die auflösung von 1Hz bekomme ich damit nie hin :( für mich ist das alles neuland, mit meiner methode beträge die aufläsung 16Hz... ich weiß da einfach nicht so richtig bescheid... Schade dass ein keiin tutorial gibt bei dem man grundsätzlich lernt wie eine DFT und dann später einer FFT funktioniert UND vor allem wie man sie umsetzt zB in assembler....sich das selbst zu lernen finde ich sehr schwer. :(
Hi Suche mal hier im DSP-Forum nach 'Schnelle FFT in Assembler'. da findest du etliche Hinweise. MfG Spess
hmm, eher kaum. wie gesagt, das ganze muss nicht schnell sein. oder muss es dass aufgrund der hohen auflösung von 1Hz? Die absoluten frequenzen könnte man auch nur von 500Hz bis 750 Hz festlegen. also eine Bandbreite von 250Hz. mfg
Wie wärs wenn du einen Ram-Speicher zu deinem Projekt hinzufügst, in den du zunächst einfach nur die Messdaten vom ADC (schnell) reinschreibst und dann im Anschluss "in Ruhe" die Berechnung durchführst, also wenn die zeitkritische Messung bereits abgeschlossen ist? So wäre dann zumindest das Problem Abtastrate gelöst...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.