Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frequenz von Tönen über Mikrofon ermitteln? (https://www.delphipraxis.net/91426-frequenz-von-toenen-ueber-mikrofon-ermitteln.html)

Marcer 4. Mai 2007 19:28


Frequenz von Tönen über Mikrofon ermitteln?
 
Hallo,

ich habe vor mit Delphi ein Gitarrenstimmprogramm zu erstellen, dazu brauche ich einen Befehl, der die Frequenz des Ton's der Gitarre mit einer, im PC gespeicherten Frequenz vergleicht, und außerdem weiß ich nicht so recht wie ich das Mikrofon ansteuern kann..

Wär toll wenn mir da jemand helfen könnte, danke schonmal :-D
:arrow: und bitte so einfach wie möglich erklären, ich kenn mich mit Delphi (noch) nicht so aus..

(ich benutze übrigens Delphi 5 falls das wichtig ist)

Mackhack 4. Mai 2007 19:38

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Herzlich willkommen in der DP.

Ich denke mal Hier im Forum suchenMCI und Hier im Forum suchenFFT sollten dir dabei helfen!

Marcer 4. Mai 2007 19:56

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Vielen dank!
Ich werd mir das erstmal durchlesen.. :-D

Wishmaster 5. Mai 2007 02:28

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Hi

Du kannst dazu die Bass.dll benutzen

das sollte dir auch helfen!

LLiinnuuxx 24. Jan 2008 22:29

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Ich schließe mich hier mal an.
habe alles vorangehende gelesen und auch umgesetzt.
Nur sind mir die Frequenzen zu ungenau die dort ausgegeben werden. Sie sind ja meistens ohne Nachkommastellen (eine würde mir da eigtl schon reichen) und was noch viel schlimmer ist nicht auf das Herz genau sondern auf 5 Herz kann man das irgendwie optimieren?

Was mich wundert ist das es nicht immer Frequenzen sind die durch 5 teilbar sind sondern manchmal auch lange Nachkommawerte auftauchen aber halt nur sehr selten ... :-/ warum?


MfG LLiinnuuxx

PS nochmal ein wenig Quellcode:
Delphi-Quellcode:
//Quellcode aus dem Beispiel übernommen

procedure [b]MeasureFrequency [/b](var LocWaveRecord : TWaveRecord);
  var
    Channel,i,j : word;
    Freq : extended;
  begin
    with LocWaveRecord do begin
      for Channel := Le to Ri do begin
        j := 0;
        for i := 1 to BufferBlocks-1 do begin
          if ((StereoBuffer[i-1,Channel] <= 0)
          and (StereoBuffer[i,Channel] > 0))
            then j := Succ(j);
        end;
        Freq := j*cSampleRate/BufferBlocks;

//Mittelwertbilden wird nicht benötigt wurde daher nicht aus dem beispiel übernommen
        if j>2 then
        if Channel = Le then Frequency.LeftChannel:=Freq else Frequency.RightChannel:=Freq;
      end;
    end;
  end;

3_of_8 24. Jan 2008 22:42

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
In der Code Library ist von mir eine FFT/DFT-Implementierung für Delphi. (http://www.delphipraxis.net/internal...t.php?t=105205)

Das ganze funktioniert ungefähr so:

Du hast eine eine Reihe von Abtastwerten des Eingabetons in einem Array (wieviele Abtastwerte pro Sekunde bestimmt die Sampling-Frequenz, meistens sowas wie 11025Hz, 22050Hz, 44100Hz)

Angenommen dein Array hat die Länge n, idealerweise eine Zweierpotenz, dann gilt:

Nach der Fourier-Transformation stehen in den Indizes 1 bis n/2-1 die Anteile der Frequenz Samplingrate/n, relativ zum Maximalwert. Die Indizes dahinter sind eine Spiegelung davon, also unbrauchbar. (sg. Alias-Effekt)

Wenn du also eine höhere Auflösung willst, kannst du z.B. eine größere Menge von Eingabewerten wählen - solange es eine Zweierpotenz ist, gibt es so gut wie keinen Geschwindigkeitsverlust, da die Laufzeit dann logarithmisch ansteigt.

LLiinnuuxx 25. Jan 2008 15:48

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Danke für die schnelle Antwort. Aber ehrlich gesagt verstehe ich den Code nicht und kann ihn damit auch nicht einbinde.

Also wie muss ich meinen / deinen Code anpassen damit ich eine genaue Frequenz bekomme ohne die Geschwindigkeit zu beeinträchtigen. Und wie binde ich deinen Code zur Ermittelung der Vorherschenden Frequenz ein?

:roll: Wäre dankbar wenn du mir das erläutern würdest.

Auf das die :idea: komme :-p

Reinhard Kern 25. Jan 2008 16:10

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Zitat:

Zitat von LLiinnuuxx
Ich schließe mich hier mal an.
habe alles vorangehende gelesen und auch umgesetzt.
Nur sind mir die Frequenzen zu ungenau die dort ausgegeben werden. Sie sind ja meistens ohne Nachkommastellen (eine würde mir da eigtl schon reichen) und was noch viel schlimmer ist nicht auf das Herz genau sondern auf 5 Herz kann man das irgendwie optimieren?
...

Die Physik lässt sich nun mal nicht betrügen: um 0.1 Hz zu messen, brauchst du eine Messzeit von mindestens 10 sec. Also bei 44 kHz Abtastung rund eine halbe Mio Messwerte. Du kannst natürlich eine Software schreiben, die in einem Sekundenbruchteil Frequenzen mit 2 Nachkommastellen ausgibt, aber die sind dann nicht mehr wert als reine Zufallszahlen.

Gruss Reinhard

shmia 25. Jan 2008 16:44

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Bei Sinustönen kann man auch die Anzahl der Nulldurchgänge ins Verhältnis zur Anzahl der Samples setzen.
Zusammen mit der Samplingfrequenz kommt man so zur Frequenz des Signals.
Das dürfte zu genauen Ergebnissen als eine FFT führen.

Das Problem ist aber, dass keine Obertöne im Signal enthalten sein dürfen. (digitales Tiefpassfilter vorschalten)
Auch Rauschen kann ein Problem sein.
Wenn man z.B. feststellt, dass mehrfach ungefähr alle 50 Samples ein Nulldurchgang (Vorzeichenwechsel erkennen) stattgefunden hat und plötzlich 2 Nulldurchgänge knapp hintereinander folgen, muss man diesen doppelten Nulldurchgang als einen zählen.

Christoph Musik 25. Jan 2008 22:35

Re: Frequenz von Tönen über Mikrofon ermitteln?
 
Ich als Musiker würde nicht die Gitarre am PC stimmen.
Der Grundton ist der Kammerton A 440 HZ.
Die meisten dynamischen (billigeren) Mikrofone heben die Frequenz wegen der besseren Sprachverständlichkeit zwischen 250 und ca. 14 000 Hz an.
Das weitere Problem ist, dass selbst bei meiner relativ gute Soundkarte im PC aufgrund von unzureichendem Signalabstand mit dem Mainbord ein nicht unrehebliches Grundrauschen vorwiegend im Bereich von 250 bis ca. 800 Hz vorhanden ist.
Das Grundrauschen ist beim normalen Stimmen mit Stimmgerät, abgesehen von Bandproben, über 1 000 Hz.
M.f.G
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz