Forum: Mikrocontroller und Digitale Elektronik Grundfrequenz eines Signals mit AVR messen


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Anton G. (Gast)


Lesenswert?

Hi,

ich möchte verschiedene Signale (im hörbaren Bereich) auf ihre 
Grundfrequenz hin messen, um einen Oszillator auf einen musikalischen 
Grundton zu tunen.

Es gibt eine application note von Atmel, die aber von einer externen 
Clock spricht, die man misst: 
http://ww1.microchip.com/downloads/en/AppNotes/doc8365.pdf

Also wohl den pin change interrupt zählen. Klingt recht einfach. Unter 
"Clock" verstehe ich allerdings ein Rechtecksignal. Ich vermute, dass 
das bei anderen Signalarten, wie Sinus oder Säge, nicht so einfach geht. 
Oder spielt die Flankenform für den Interrupt keine Rolle?

Hat jemand Tipps für mich?

von Ingo Less (Gast)


Lesenswert?

Anton G. schrieb:
> Oder spielt die Flankenform für den Interrupt keine Rolle?
Die Eingänge sind Schmitt-Getriggert

von EAF (Gast)


Lesenswert?

Anton G. schrieb:
> Oder spielt die Flankenform für den Interrupt keine Rolle?
Das stimmt, die Flankenform macht den Interrupts nichts aus.

Mir scheint, du suchst eine FFT

von Stefan S. (chiefeinherjar)


Lesenswert?

EAF schrieb:
> Anton G. schrieb:
>
>> Oder spielt die Flankenform für den Interrupt keine Rolle?
>
> Das stimmt, die Flankenform macht den Interrupts nichts aus.
> Mir scheint, du suchst eine FFT

Warum eine FFT? Für die Grundfrequenz reicht doch der reziproke 
Frequenzzähler hier aus dem Forum.
Frag mal die Suchfunktion (es gab sogar einen Artikel hier, der einen 
Frequenzzähler mit einem AVR vorgestellt hat, glaube ich).

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Warum so kompliziert? Entscheidend ist die Erkennung der Nulldurchgänge.
Wenn man allerdings ein Signal mit kräftigen Harmonischen hat, kann es 
sein dass der Schmitt-Trigger die doppelte oder dreifache Anzahl 
Nulldurchgänge liefert, das hängt von seiner Lage der beiden 
Triggerpunkte und der Hysterese ab.

Die Appnote hat jemand geschrieben, der vorher noch nie von 
Frequenzzählern gehört hatte. Derart umständlich formuliert, man kapiert 
kaum was er eigentlich sagen will.
Das Prinzip des Reziproken Zählers scheint ihm unbekannt zu sein, gerade 
für Niederfrequenz ist das viel höher auflösend. Dazu muss man 
allerdings eine große Division ausführen, damit ist der Tiny eine Weile 
beschäftigt.

von HildeK (Gast)


Angehängte Dateien:

Lesenswert?

Anton G. schrieb:
> ich möchte verschiedene Signale (im hörbaren Bereich) auf ihre
> Grundfrequenz hin messen, um einen Oszillator auf einen musikalischen
> Grundton zu tunen.

Aufgenommene Signale von einem realen Musikinstrument?

Anton G. schrieb:
> Also wohl den pin change interrupt zählen.

So einfach dürfte die Grundfrequenz nicht bestimmbar sein.
Siehe Anhang, ein klingendes 'b' von einem Horn, aufgenommen mit 
einfachem Equipment. Da kommt dann eher die Frequenz der zweiten 
Harmonischen heraus.

Das Bild kann bei anderen Schallquellen noch viel mehr Nulldurchgänge 
bei gleicher Grundfrequenz enthalten.

von EAF (Gast)


Lesenswert?

Stefan S. schrieb:
> Warum eine FFT?

Wenn von
Anton G. schrieb:
> Grundfrequenz
die Rede ist, wird wohl eine Gemengelage verschiedenster Frequenzen 
vorliegen.

Dann ist schnell Ende mit Nulldurchgänge zählen.

von Stefan S. (chiefeinherjar)


Lesenswert?

Edit: War schief gewickelt, ich dachte, er wollte denn Oszillator messen 
und nicht das "musikalische" Eingangssignal.

Da bin ich klar bei euch, dass das wohl nach einer FFT schreit!

: Bearbeitet durch User
von Stefan S. (chiefeinherjar)


Lesenswert?

Anton G. schrieb:
> ich möchte verschiedene Signale (im hörbaren Bereich) auf ihre
> Grundfrequenz hin messen, um einen Oszillator auf einen musikalischen
> Grundton zu tunen.

Nachtrag: TO, könntest du bitte genauer erklären, was du damit meinst? 
Wie sieht dein Eingangssignal aus?
Ist es ein Oszillator, den du verstimmen willst?
Oder ein Instrument bzw Musik?

Immerhin wird weiter unten von

Anton G. schrieb:
> anderen Signalarten, wie Sinus oder Säge,
Gesprochen, was für mich so klingt, als ob eine PLL für einen LFO 
programmiert werden soll - und bei Sinus oder Sägezahn würde tatsächlich 
ein normaler Frequenzzähler ausreichen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?


von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Einfach mal so Eingeworfen.
Analoge Synthesizer, stimmen sich mit dem Prinzip des PLL
Sprich ein Kontrollierter (Quarz) Oszilator schwingt mit der exakten 
Frequenz, und die zu Stimmenden VCO's werden mit einer PLL so lange 
Gestimmt biss sie sauber einrasten.
Als groben Rahmen aus dem High-End Musik-Sektor.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

HildeK schrieb:
> So einfach dürfte die Grundfrequenz nicht bestimmbar sein.
> Siehe Anhang, ein klingendes 'b' von einem Horn, aufgenommen mit
> einfachem Equipment. Da kommt dann eher die Frequenz der zweiten
> Harmonischen heraus.

Typisch hat die Grundwelle die höchste Amplitude. Mit einem 
Schmitt-Trigger, dessen Hysterese man auf 10% bzw. 90% der Spitzenwerte 
einregelt, sollte das gehen. Z.B. mit 2 Kondensatoren, die sich über 
Dioden auf die Spitzenwerte - 0,7V aufladen und dann auf 2 Komparatoren 
gehen.

von Gunnar F. (gufi36)


Lesenswert?

leider sind viele Schallquellen unx Instrumente nicht typisch. Die 
Grundwelle ist oft schwach. Gitarre, Geige, usw...

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Gunnar F. schrieb:
> leider sind viele Schallquellen unx Instrumente nicht typisch. Die
> Grundwelle ist oft schwach. Gitarre, Geige, usw...

Ist richtig und trotzdem schaffen Gute Harmonizer es die Grund-Frequenz 
zu finden, und können diese exakt bestimmen.
Angefangen schon bei Stimmgeräten.

von HildeK (Gast)


Lesenswert?

@Peter D.
Ja, das ist ein möglicher Vorschlag.
Ich wollte nur darauf hinweisen, dass ein einfacher 
Schmitt-Trigger-Input am AVR und der Pin Change Interrupt nicht 
zufriedenstellende Ergebnisse liefer wird. Man muss vorher aufbereiten.
Außerdem: Signale von realen Instrumenten sehen sicher nicht immer so 
aus, wie hier an dem Hornbeispiel. Wobei: ich habe mir gerade eine 
Aufnahme eines Bariton und einer Trompete angeschaut. Das sieht eher 
besser aus.

von Wolfgang (Gast)


Lesenswert?

Matthias S. schrieb:
> Statt FFT bietet sich bei einem kleinen MC auch der Goertzel Algorithmus
> an:

Dafür muss man aber die Frequenz wissen. Der Goertzel Algorithmus 
liefert einen Datenpunkt aus dem Ergebnis einer FFT.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ich würde es mit Autokorrelation versuchen und das Signal vorher evtl.
noch auf den Bereich der zu erwartenden Grundfrequenzen bandpassfiltern
(für Musikinstrumente bspw. 15 Hz bis 5 kHz).

von Anton G. (Gast)


Lesenswert?

schon mal Danke für die vielen Hinweise!

Zur Klärung: ich will keine Musikinstrumente tunen (außer man bezeichnet 
eine Oszillatorschaltung schon als eines), sondern ein Rechteck, 
Dreieck- oder Sägezahnsignal, ggf. auch einen Sinus frequenz-messen.

Und eben im Audiobereich ca. 20Hz - 20kHz

von EAF (Gast)


Lesenswert?

Tja....
Dann eben doch Nulldurchgänge zählen.

von Egon D. (Gast)


Lesenswert?

Yalu X. schrieb:

> Ich würde es mit Autokorrelation versuchen [...]

Die Herren Wiener und Chintschin lassen grüßen...

von Wolfgang (Gast)


Lesenswert?

Egon D. schrieb:
> Die Herren Wiener und Chintschin lassen grüßen...

Aaach - es geht nur darum, die Grundfrequenz zu bestimmen. Das Spektrum 
benötigt niemand.

von Egon D. (Gast)


Lesenswert?

Wolfgang schrieb:

> Egon D. schrieb:
>> Die Herren Wiener und Chintschin lassen grüßen...
>
> Aaach - es geht nur darum, die Grundfrequenz zu bestimmen.

Das hatte ich verstanden.


> Das Spektrum benötigt niemand.

Jein.
Yalu hat Auswertung der Autokorrelationsfunktion vorgeschlagen,
und die bestimmt man schätzungsweise am schnellsten über die
inverse FFT der spektralen Leistungsdichte. Ich vermute, dass
zwei mal N*log(N) immer noch schneller ist als N^2.

von Rainer V. (a_zip)


Lesenswert?

Ich glaube, dass es nur was "Richtiges" wird, wenn die Abtastrate hoch 
genug ist und eine FFT laufen kann. Alles andere ist Sonderfall, bei dem 
man sich die Randbedingungen sehr genau anschauen muß!! Also warten wir 
auf Infos...
Gruß Rainer

von Glaser (Gast)


Lesenswert?

> Hat jemand Tipps für mich?

Schalte einen VCF vor deine "Zaehl"-Mimik.
Den VCF drehst du dann langsam auf, bis der Zaehler stabile Werte 
liefert.

von m.n. (Gast)


Lesenswert?

Anton G. schrieb:
> Dreieck- oder Sägezahnsignal, ggf. auch einen Sinus frequenz-messen.
>
> Und eben im Audiobereich ca. 20Hz - 20kHz

Dann nimm einen reziproken Frequenzzähler. Unter dem Stichwort findest 
Du hier im Forum jede Menge Schaltungen und Programme.
Bleibt einzig die Frage, wieviele Stellen angezeigt werden sollen: 4 - 
8, 4xLCD, 5x7-Segment, 6x7-Segment, 2x16 LCD-Modul, ATtiny45, 
ATtiny2313, ATmegaXXX, Arduino - alles kein Problem.

Anton G. schrieb:
> Ich vermute, dass
> das bei anderen Signalarten, wie Sinus oder Säge, nicht so einfach geht.
> Oder spielt die Flankenform für den Interrupt keine Rolle?

Ein Komparator am Eingang liefert saubere Rechtecksignale und bietet 
eine Empfindlichkeit bis in den mV-Bereich.

von Wolfgang (Gast)


Lesenswert?

m.n. schrieb:
> Bleibt einzig die Frage, wieviele Stellen angezeigt werden sollen: 4 -
> 8, 4xLCD, 5x7-Segment, 6x7-Segment, 2x16 LCD-Modul, ATtiny45,
> ATtiny2313, ATmegaXXX, Arduino - alles kein Problem.

Wenn du jetzt auch noch verrätst, wie das Signal aufbereitet werden 
muss, um eine Qualität der Zeitmessung zu erreichen, die eine Anzeige 
der Signalfrequenz auf gar 8 Stellen rechtfertigt, bist du der King.
Vielleicht sollte man gleich noch eine mindestens 5-stellige Anzeige für 
das Vertrauensintervall der Messung vorsehen ;-)
2x16 wird man also schon gut brauchen.

von m.n. (Gast)


Lesenswert?

Wolfgang schrieb:
> Wenn du jetzt auch noch verrätst, wie das Signal aufbereitet werden
> muss, um eine Qualität der Zeitmessung zu erreichen, die eine Anzeige
> der Signalfrequenz auf gar 8 Stellen rechtfertigt, bist du der King.

Lass stecken! So, wie Du fragst, willst Du es doch garnicht wissen.

von ggbb (Gast)


Lesenswert?

Hallo Anton,
ich habe für eine Art "Bassgitarre" eine Frequenzmessung der 
Grundfrequenz nach diesem Algorithmus gemacht, der sehr gut auf einem 
AVR zu implementieren und auch nicht viel Rechenleistung benötigt:

https://www.cycfi.com/2017/10/fast-and-efficient-pitch-detection/

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.