| Autor |
Beitrag |
Andreas Pfau
      
Beiträge: 997
|
Verfasst: Fr 09.04.04 20:35
Hallo,
ich habe grade ein Prog geschreiben, das eine Wave abspielt, und die GEschwindigkeit stufenlos verändern kann, wobei bei erhöhung des Tempos automatisch die Tonhöhe steigt und umgekeht. Das habe ich gemacht indem ich einfach zum verlangsamen einzelne Samples wiederhole, um zu beschleunigen Samples auslassen (alles interpoliert).
Soweit so gut... aber es gibt z.b. für Winamp Plugins, mit denen man Tempo und Tonhöhe UNABHÄNGIG regeln kann... kann mir das mal jemand erklären? Ic habe grade eins gesehen das nennt sich "Furier", hat das also was Fourier-Analyse zu tun?
Kann mir da jemand mal nen Link zu geben oder mir das grob erklären, wie man so was implementiert?
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 09:05
ich hab das nie gemacht, jedoch habe ich mich mal ne weile mit der fourier Analyse beschäftigt (ja das ist das). Man müsste eigentlich blos eine analyse für sagen wir je 20ms anfertigen, die frequenzen verschieben und dann wieder mit sin die einzelnen Schwingungen überlagern, das problem dürfte sein, dass diese Berechnung extrem Verlustbehaftet ist  , d.h. bei waves mit z.B. 11kHz wird man es vergessen können, da nurnoch gerausche übrig bleibt 
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 11:06
Hallo,
OK, also, ich kenn mich da auch net sooo aus, Foerier heißt doch, ich kann eine beliebige Signalform in eine REihe (überlagerter) Sinus-Signale zerlegen... Also 20ms sind sicher zu viel, aber anegnommen ich nehme mal 20 Samples, analysiere die, dann habe ich so was wie
20Hz - 0,6
40Hz - 0,2
60Hz - 1,35
(um mal ein paar fiktive Werte zu nehmen)
Na ja, dann müsste ich das Frequenzspektrum verschieben und wieder zusammenfügen... Wenn ich das Temp verdopple müsste ich die Frequenz halbieren, damit KEINE Tonhöhenveränderung auftritt...
Kannst du mir da mal ein paar Links (Formeln) schicken, wie ich diese Werte mit Forier zerlege und wieder zusammensetzen?
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 11:25
das zerlegen geht mit dieser Fourier analyse such mal im Forum nach FOURIER ANALYSE
beim wieder zusammensetzen machst du einfach sin(t/50{Hz})*intsensität(t, 50{Hz}) + sin(t/51{Hz})*intsensität(t, 51{Hz}).....
dabei kannst du festlegen, wie der ton transformiert wird (verschieben der frequenzen) und du kannst festlegen, wie lange der ton gespielt wird(strecken/stauchen von t bei der Fourier analyse, hier vereinfacht dargestellt als intensität(t, freq))
wahrscheinlich muss man sogar auf zeiten von 1msec runtergehen
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 11:49
Hallo,
*puh* mein realschulwissen stößt langsam an seine grenzen... recht komplex...
in der zwischenzeit habe ich ein kleines experiment angestellt: ich habe immer 10 samples genommen, und frequenz und druchschnittliche amplitude bestimmt... die frequenz, indem ich einfach gesagt habe, geht das signal in eine andere richtung als beim vorigen sample, erhöhe frequenz um 1. dann habe ich ein sinus mit eben jener frequenz umd amplitude erzeugt, und seihe da - man versteht es! seeeeeeeehr hölzern, aber ich denke, ich bin auf dem richtigen weg. Mal sehen, ob das auch mit Fourier so wunderbar klappt...
also, danke mal 
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 12:12
also für die fourier analyse würde ich mir ne fertige unit besorgen, das teil is elends komplex. mittlerweile bist du sicherlich auch auf meine gehversuche auf dem fft terrain hier im Forum gestoßen, ich hatte irgendwann mal ne unit gepostet, die die FFT analyse recht eigenständig schnell und zuverlässig gemacht hat. soweit ich weis war a auch was zum wieder zusammensetzen der Frequenzen dabei
allerdings habe ich es nie geschafft dieses teil mitwaves zu füttern, musste immer zig sin schwinungen oder gar den zufallsgenerator verwenden
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 13:35
Hallo,
das macht mir ja keinen mut...
na ja, aber du scheinst dich da auszukennen - sag mal, gibt es denn keine andere Möglichkeit? Alles was ich brauche, ist eine Art "Spectrum Analyzer", und einen simplen Algo zum das wider zusammensetzen (haben wir ja schon). Es würden ja experimentell 5 bis 10 Frequenzbänder reichen (selbst mit nur einem Band hört man was, aber halt arg verzerrt). Oder ist FFT wirklich die einzige praktikable Möglichkeit, eine Funktion in ein Spektrum zu zerlegen?
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 13:37
als ich damals gesucht hab bin ich eigentlich nur auf FFT gestoßen, jedoch der Grund warum mein projekt nix geworden ist, war dass ich das mit dem wav files auslesen nicht hinbekommen hab
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 14:50
Soll das heißen, du hast das gleiche versucht wie ich? Nun, ich kann dir den Code zum Waves auslesen schicken. Habe da einen, der eine Wave lädt und nach 44.1kHz, Stereo, 16Bit konvertiert. Ausgabe inbegriffen.
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 15:28
nunja, das ist bei mir soweit ich mich erinnere über ein Jahr her, dass ich das versucht hab
sollte ein player mit visualisierung werden, wobei es mein ziel war, dass die visualisierung auch wirklich was erkennt (einsetzen bestimmter Instrumente, ...)und nicht nur wie in winamp und co ein planloses rumgehüfe, das grade mal auf ein paar bässe reagiert.
hab im moment auch einiges anderes Zeug vor/zu tun wie ein kleinen Content management system an dem ich bastle.
Woran genau bastelst du denn, so ne art sound edit tool?
möglicherweise könnte man sich ja tatsächlich zusammentun, ich geh mal in meinen alten sourcen wühlen, nach der fourier unit....
MathiasH
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 15:45
Nu ja, das ist eigentlich gar nix, was ich da mache. Ich habe in Winamp das neue SPS gesehen, und da kam mir die Idee dazu. Nur son rumgebastle. Und jetzt bin ich grade dabei, mir ein "Turntable" zu programmieren, also alles nur spielerei. Es reizt mich einfach, solche dinge selber zu proggen, aber ich weiß jetzt nicht mehr so genau, ob das noch hinhaut...
Ich habe bei Paul Bourke's nen kleinen C-Code gefunden (DFT in ca. 10 Zeilen), das wäre schonmal was. Aber wenn ich die Funktion mit einem Sinus füttere kommt ein Diagramm wie ne Halfpipe raus, aber dabei solltedoch ein Balken rauskommen, und zwar in dem Spektrum, wo der Sinus liegt, oder wie muss man das interpretieren? Ich sehe schon, ich muss mich da noch arg vertiefen,w enn ich was erreichen will...
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: Sa 10.04.04 16:02
also bei der fft analyse die ich da hatte hat das funktioniert, du hast ne kleine schnwingung aus sagen wir mal 3x sin gemacht und in der FFT-Analyse konnte man klar die 3 frequenzen erkennen
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 17:32
Na ja, wie gesagt, mein REalschulwissen stößt da schnell an Grenzen - was sind denn überhaupt die4se beiden Werte, real und imaginär? Wozu der imaginäre?
Ach ja, hier ein Plot:
(0 in der mitte des diagramms, habe das FFT vertikal 3x gezoomt) Kannst du mir erklären, was ich aus diesem Diagramm ablesen kann? Warum wiederholt sich alles rechts, und was soll dieser imaginäre Wert, braucht man den überhaupt? Muss ich den bei der eingabe auch beachten, oder ist es ok, dass ich den auf 0 lege?
_________________ Life is a bad adventure, but the graphic is really good!
|
|
Gandalfus
      
Beiträge: 129
|
Verfasst: Sa 10.04.04 18:06
| Andreas Pfau hat folgendes geschrieben: |
Ich habe bei Paul Bourke's nen kleinen C-Code gefunden (DFT in ca. 10 Zeilen) |
10 Zeilen C-Code muss man erstmal in 100 Zeilen lesbaren Code konvertieren. 
_________________ Wennn man feststellt, dass es drei Moeglichkeiten gibt, die einen Vorgang schiefgehen lassen koennen und man diese ausschaltet, entstehen automatisch drei neue Moeglichkeiten.
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 18:21
Ja, OK, so sieht is in Delphi aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure DFT(Direction, SampleCount: Integer; RealIn, ImagIn: TVector; var RealOut, ImagOut: TVector); var I, K: Integer; Arg: Double; CosArg, SinArg: Double; begin SetLength(RealOut, SampleCount); SetLength(ImagOut, SampleCount);
for I := 0 to SampleCount - 1 do begin RealOut[I] := 0; ImagOut[I] := 0; Arg := - Direction * 2 * 3.141592654 * I / SampleCount; for K := 0 to SampleCount - 1 do begin CosArg := Cos(K * Arg); SinArg := Sin(K * Arg); RealOut[I] := RealOut[I] + (RealIn[K] * CosArg - ImagIn[K] * SinArg); ImagOut[I] := ImagOut[I] + (RealIn[K] * SinArg + ImagIn[K] * CosArg); end; end;
if (Direction = 1) then begin for I := 0 to SampleCount - 1 do begin RealOut[I] := RealOut[I] / SampleCount; ImagOut[I] := ImagOut[I] / SampleCount; end; end; end; |
Die Schleife in der Mitte ist die eigentliche Analyse, OK, das sind auch mehr als 10, aber doch recht überschaubar.
Natürlich schein C++ meist unübersichtlich, aber ansich liest es sich für mich schon fast wie klartext... Gute-Nacht-Lektüre... Nur wenns um Pointer und Arrays geht wirds manchmal eng...
PS: kennst du das gefühl, wenn du grade was voll interessantes programmierst und am verdursten bist, aber zu faul bist, die Wasserflasche rechts neben dir zu greifen...? Ich hasse das! 
_________________ Life is a bad adventure, but the graphic is really good!
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: Sa 10.04.04 21:13
Hidelihey,
um es ein wenig besser zu verstehen habe ich mir ein schönes Spielzeug geproggt:
downzuloaden unter www.delphistuff.gmxh...downloads/dfttoy.zip
Tja, aber wer erklärt mir jetzt den Utnerscheid zwischen Real und Imaginär?  Würde mir arg helfen, Danke im Vorraus!
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: So 11.04.04 08:11
das war eins von den sachen die ich nie verstanden hab, was ich mir allerdings vorstellen könnte dass das so art imaginäre lösungen sind
Erklärung:
imaginäre Zahlen besitzen einen real und einen imaginäreil. Das sieht dann in etwa so aus (in Mathe): x =3+2i. Diese Seltsamen Zahlen werden für ansonsten nicht lösbare Gleichungen benötigt Beispiel:
[code]x^2=-1
x1,2=+-sqrt(-1) //nach den normalen gesetzen der mathematik nicht lösbar, aber wir definieren i^2=-1
//also erhalten wir:
x1,2=+-i
Du hast da jetzt eh das Programm das ich damals gefunden hab, fand ich recht übersichtlich, und wie ich sehe biste fleißig am analysieren
trag mal in dem analyse Programm die frequenzen ein, macht die sache wohl etwas einfacher zu verstehen
was mich allerdings stutzig macht, ist, dass man nicht keine/kaum Veränderung erkennt, wenn man z.B. 3 sin überlagert und dann deren frequenzen ändert, ich glaube mich zu erinnern, dass die extremwerte in der analyse dann gewandert sind....
Hingegen in deinem Programm bleiben die extremwerte immer am rand und verändern nur ihre form nur geringfügig...
ich hab mal die regler für die frequenz nen größeren bereich abdecken lassen (0-100), scheint doch alles zu funktionieren, werden wohl rechenungenauigkeiten im unteren bereich sein...
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: So 11.04.04 08:27
ich hab grad nochmal ein bisschen rumprobiert, also bei dreieck usw kommt ein rechter käse raus, eigentlich ist diese analyse ja auf sin (und cos) ausgelegt, denke nicht dass das allzu sinnvoll ist, natürlich kann man das auch in sin zerlegen, so werden ja z.T. in technischen geräten auch rechteckspannungen hergestellt, aber bei der analyse kommt dann doch nix allzu sinnvolles raus
sinvolle sachen kommen bis zu frequenzen von 400 raus
ich würde das skalieren mit dem zoom regler nur auf das obere diagramm beziehen
was du mal versuchen solltest ist eine überlagerung von 20 sin oder so, man glaubt es kaum, aber das programm findet es immernoch heraus welche frequenzen und amplituden es waren
interessant wird es dann wenn du es mit dem sound versuchst, auf das ergebniss bin ich gespannt
und nimm mal diese komisch XP manifest unit raus, die hat man nicht und brauht man nicht 
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Andreas Pfau 
      
Beiträge: 997
|
Verfasst: So 11.04.04 10:09
Hallo,
fakten ohne ende... also, welche Frequenzen wo sind weiß ich doch gar net... die DFT-Funktion liefert mir einfach einen array, aber was der zu bedeuten hat weiß ich net...
Auf Paul Bourke's hab ich was vonner Nyquist-Frequenz gelesen... so wie ich das verstehe kann ich alles evrnachlässigen, was sich in der Rechten Hälfte des Diagramms befindet, da diese kleienr als N/2 ist (das erklärt warum ich mit dem Zeugs auf der rechten Seite nix anfangen kann).
Aber die imaginären Zahlen... OK, i.Z. sind Zahlen, die es eiegntlich net gibt, die man aber algebraisch ausdrücken kann, nur, der imaginärwert ist doch bei mir eine zahl, also ganz konkret eine zahl... außerdem scheint es bei manchen funktionen sogar sinnvoll zu sein, eine blick auf den imag. Wert zu werfen... Ich nehmen an, dass bei Fenstern wie Hanning, Flatttop oder wie sie alle heißen die Real- und Imaginärwerte irgendwie miteinander vcernknüpft werden, aber so ganz werde ich doch net schlau draus.
Na ja, kannst du mir erklären, wie ich rausfinde, welche X-Position welcher Frequenz angehört...? Müsste logarithmisch sein, links 0Hz, und rechts bzw. in der Mitte...?
_________________ Life is a bad adventure, but the graphic is really good!
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: So 11.04.04 10:22
richtig logischerweise müsste 0hz am linken rand sein, die frequenz am rechten Rand müsste man igendwie deiner umrechnung oder der FFT funktion entlocken...
bei sin/cos ist ja 2*pi eine ganze schwinung, ich weis nur nicht, ob mit hz ganze oder aber halbe schwingungen gemessen werden, aber was ich mich erinnere waren es ganze
hast du bei den fraquenz reglern schonmal mit werden von z.B. 200 experimentiert, bei nem sinus kann man da ganz klar erkennen, wie sich die linie(n) verschiebt wenn man die frequenz ändert. je nach dem, wie dieser wert umgerechnet wird kannst du daraus ja ablesen, welche frequenz an dieser stelle im FFT diagramm ist
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
|