Frequenzen / Audio
-
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
-
Vor allem habt Ihr übersehen, daß auf meiner Seite dazu eine schöne PDF-Datei steht:
http://marcus.baeckmann.de/DFT.pdf
Fourier-Analyse war und ist neben C++ nämlich mein weiteres Steckenpferd.
Da finden sich auch einige Bilder zum Windowing.
[ Dieser Beitrag wurde am 23.11.2002 um 13:05 Uhr von Marc++us editiert. ]
-
Ich muss hier mal diesen alten thread wieder aufleben lassen.
Ich hab mir gerade Marc++us' Arbeit vorgenommen und finde da mal so schnell eine Frage.
Hab nämlich so allgemein das Problem, dass ich bei Integralformeln (die ich schon seit 4 Jahren nicht mehr gebraucht hab) ne Weile brauche..
ich versuch das mal per Hand nachzustellen:(allgemeine (Auslenkung ( eulersche Konstante hoch |Was ist j?| Auslenkung der Welle mal 2 PI * frequenz * Zeit einer zum Zeitpunkt Teilfrequenz) t) unendlich / -j*2*pi*f*t X(f) = | x(t) * e dt (t ist der veränderliche wert) / -unendlich
ist doch so weit korrekt, oder hab ich schon zu lange nicht mehr mit Integralen gerechnet?
Was ist nun aber j?bei den periodischen Funktionen wird das Ganze dann noch blöder. hierkommt ein m dazu, welches ich nicht deuten kann (und noch einiges anderes, mit dem ich aber klar komme)
Kann mir da mal jemand helfen?
cYa
DjR
-
Das "j" ist die wurzel aus -1 für Etechniker
. Mathematiker sagen auch "i" dazu (Pfui). Hättest du dafür nicht nen neuen Thread aufmachen können anstatt nen uralten auszubuddeln ?
-
Und e^j*x ist laut Euler identisch mit cos(x) + j * sin(x).
-
*grml* ich hab die komplexen Zahlen seit der 11. Klasse verdrängt.. nun muss ich mir des alles noch mal neu anlesen....
Naja, drei Jahre Ausbildung zum fachinformatiker haben meinen Keks schon völlig aufgeweicht. Wird Zeit, mal wieder was fürs Hirn zu machen..