Frequenzen / Audio
-
weiß jemand, wie ich aus soner tollen wav-datei die frequenzen ausrechnen kann, die drin vorkommen? irgendwann wollte ich dann einen equalizer proggen...
jemand ne ahnung, was für welche algorithmen dafür gut sind?
-
Stichwort Fourieranalyse.
-
was ich zum thema fourier gefunden habe ist in etwa folgendes:
x(t)=a0/2 + a1*cos(1*w0*t) + b1*sin(1*w0*t) + a2*cos(2*w0*t) + b2*sin(2*w0*t) +...
aber viel schlauer bin ich jetzt auch noch nicht...
-
das ist doch schon was
die fourier analyse besagt, dass man jedes beliebige periodische Signal in eine vielzahl von überlagerten sinusschwingungen (bzw sin und cos) verschiedener frequenz zerlegen kann (einfach ausgedrückt).
genau das machst du und dann weißt du, wieviele prozent der schwingungen zwischen 0 und 10Hz, 10 und 100Hz...etc.. liegen!
schon hast du deinen equalizer
eh ganz easy
-
ganz easy, hmm :p
wie näher ich das denn an, also von wegen sin- und cos-anteile und so, ich kann ja schlecht alles mal durchprobieren und dann gucken was am besten passt....
-
Original erstellt von The Amarin:
[QB]wie näher ich das denn an, also von wegen sin- und cos-anteile und so, ich kann ja schlecht alles mal durchprobieren und dann gucken was am besten passt....[QB]genau das macht dir ja die Fourier-Analyse.
du erhältst eine (je nach Signal) kurze bis unendlich lange Reihe. (bildungsgesetz)
bei musik hald ne wirklich unendlich lange, die du so lange fortsetzen kannst, wie es deinen ansprüchen genügt (hald wie genau du das ganze haben willst)
-
Ja, vielen Dank schonmal... hast Du zufällig noch eine Seite bzw. ein gutes Tutorial zu dem Thema auf Lager?
Also Fourier-Analyse, wie das geht. Danke!
-
Mann exakt 2.457 sekunden hats gedauert mit googel was zu finden, aber bitte:
http://alphard.ethz.ch/hafner/PPS/PPS2000/Fourier/Bericht.htmDAS ist genau das, was du suchst (Fourier-Analyse und Musik)
-
OK, danke nochmal, ich hab mir da mehrere Seiten aus der Suche angeguckt, aber irgendwie nicht viel verstanden, aber jetzt habe ich was, auf das ich mich werfen kann
-
Geh mal auf www.tyobybear.de. Der hat ein paar Links zum Thema DSP.
Du solltest aber Ahnung von Mathe haben oder es gleich vergessen. Du willst einen EQ schreiben (warum auch immer du keinen fertigen nehmen willst) Da hab ich ne leichtere Idee, als Fourier-Analyse: Filter.
Teile dein Signal mit Filtern in zwei oder mehr Bänder auf, die du dann einzeln lauter oder leiser machen kannst und zum Schluss einfach wieder zusammenaddierst.
-
Also letztes Jahr hatte ich 15 Punkte in Mathe
Die Frage ist nur, ob das reicht...
Kann es sein, dass du dich bei der Adresse vertippt hast, die funzt bei mir nämlich nicht
Danke im Vorrraus...
-
Ups, sollte www.tobybear.de heißen
Ach ja und für den Einstieg: Hier ein 1Pol LP Filter (1Pol == 6dB pro Oktave)
(Ist Mono)float lpFilter (float in, float cutoff) { static float o; o += cutoff * (in - o); return o; }
Angenommen in 's' steht der aktuelle Wert aus dem Signal:
tiefen = lpFilter(s, .2); hoehen = s - tiefen;
lauter/leiser machen:
tiefen *= low_gain; hoehen *= high_gain;
und signal wieder zusammenbasteln:
neues_s = tiefen + hoehen;
Sereo funzt eigentlich genauso, nur das mein Filter da nicht so ganz funzt, da er nur eine Statische Variable hat. Dann musst du halt ne Variable übergeben, die diese Funktion übernimmt (muss dann in der Aufrufenden Funktion statisch sein).
Und falls dir 1Pol nicht reicht, kann ich dier auch einen 2, 3 oder N Pol filter bauen. Der benötigt dann aber pro Stufe eine weitere Variable.Aber erstmal Stereobetrieb:
float lpFilter (float in, float cutoff, float o) { o += cutoff * (in - o); return o; } void verarbeitung (...) { static float ol, or; sl_low = lpFilter (signal, .2, ol); sr_low = lpFilter (signal, .2, or); ...
Ach ja Cutofffrequnz ist abhängig von der Nyquistfrequenz (Halbe Samplerate).
-
Der letzte Parameter muss natürlich per Referenz übergeben werden.
-
ok, das mit dem Filtern funktioniert jetzt. Ich kann auch die gefilterte Wavedatei wieder abspeichern, aber irgendwie geht bei der umformung
float temp; int out;
out=(signed char)(temp*256.0);etwas schief. Bei leicht negativen Werten von temp ist alles null (oder sogar positiv?). Wie kann man das verhindern?
danke im vorrraus
-
Original erstellt von <TheAmarin[ohne pwd...]>:
**
float temp; int out;
out=(signed char)(temp*256.0);
**geht ne signedchar nicht von -128 bis +127?
temp*127.f müßte es dann wohl sein, oder? (falls -1.f<temp<1.f)
rapso->greets();
-
mal noch ein kleiner tip am rande:
in der dsv hat sich eigentlich die FFT (fast fourier transform) eingebürgert - ausserdem solltest du dich, wenn du eine solche transformation benutzen willst, auch mit dem sog. windowing befassen, um (hörbare) pegelsprünge an den blockgrenzen bei der rücktransformation zu vermeiden.
alternativ kannst du dein signal natürlich auch mit einer filterbank "zerlegen" und die bänder einzeln gewichten. stichworte FIR/IIR filter
FIR : keine phasenverzerrung, aber unterschiedliche länge (taps) bei verschiedenen frequenzen - schlecht zu programmieren
IIR : filter haben gleiche länge, da kaskadiert - dafür aber phasenverzerrungen (naja, hat ein analoger eq ja auch)
rocknix ///
-
alternativ kannst du dein signal natürlich auch mit einer filterbank "zerlegen" und die bänder einzeln gewichten. stichworte FIR/IIR filter
Für jemanden, der keine Ahnung von Fourier hat ist das Wohl leichter. Und ich hab ihm doch ne Filterfunktion gegeben.
-
Ok, danke! Mein FFT funktioniert jetzt, genauso die Wave-ein- und -ausgabe...
Das Problem ist jetzt nur noch das von euch erwähnte "knacksen" zwischen zwei blöcken. kannst du zufällig kurz erklären, wie das "windowing" funktioniert? ist das sehr kompliziert... ?
-
Hui, ich bin zwar c++-DAU, aber was windowing ist, weiß ich.
Du nimmst ja einen Ausschnitt aus Deiner Wave-Datei, um die FFT zu machen. Dummerweise überlagerst Du damit automatisch Deinem Signal ein Rechteck-Signal, was sich massiv in der FFT niederschlägt. Die FFT eines Rechtecks ist sin(x)/x, auch si(x) genannt. Das macht Dir Deine schöne FFT kaputt. Abhilfe schafft es dann, Dein Signal im Zeitbereich vor der FFT zu "fenstern". Fensterfunktionen sind Funktionen, die an den Rändern sanft auslaufen, so daß Dein Signal nicht plötzlich aufhört. Man kann natürlich nicht jede Funktion, die diese Vorgabe erfüllt nehmen, da dies natürlich ebenfalls Einfluß auf die FFT hat. Es gibt da verschiedene Ansätze, die als Fensterfunktion tauglich sind, such mal mit Google nach folgenden Begriffen:
Hanning
Hamming
BlackmanDie Herren haben taugliche Fensterfunktionen entwickelt.
Matze
-
ok, danke
mal gucken, wann ich mal wieder zu viel zeit habe und daran weiterbastel