hi, wie das topic schon sagt, suche ich einen microcontroller, mit folgenden 'features': - mind. 2x ADC (12 bit minimum, gerne auch 16 bit, minimale abtastrate 44,1 khz, gerne 48 khz) - hardware FFT, oder schnellgenug für software FFT, um beide eingänge zu FFTen. - mind. 2x DAC (zur not könnte man hier auch eine 'externe' lösung in betracht ziehen) was ich damit machen will: 1.) es sollen 2 audiosignale (L+R) hereinkommen. 2.) diese beiden eingänge sollen in ein fourier spektrum zerlegt werden. 3.) anhand des spektrums werden dann verschiedene anteile angehoben, oder abgeschwächt. also ein equalizer. 4.) das veränderte fourier spektrum muss wieder aufaddiert werden, und dann 5.) per dac ausgegeben werden. nun ist es so, das ich nicht der fourier crack bin. daher kann ich die benötigten mikrocontroller resourcen nur schwer einschätzen. sehr schön wäre es, wenn das eingangssignal schnellstmöglich auch wieder heraus kommt. da ich aber immer blockweisse fft machen muss wird das wohl nicht möglich sein. der mikrocontroller soll zusätzlich noch ein grafisches display ansteuern. zwar werden hier kaum resourcen verbraucht, da der bildaufbau dort ruhig langsam gehen kann, aber vieleiht kennt noch gleich jemand ein grafisches farbdisplay, mit mind. 4 farben. :D nun zu meiner frage: - kennt jemand einen mikrocontroller, der dazu fähig ist? die firma, etc. ist mir egal. - hat mir jemand einen vorschlag, über welchen zeitraum ich werte capturen soll, um dann fourier auszuführen?
Hallo Matthias das ist evtl eine Aufgabe für Microchip's dsPIC30. Grundsätzlich gibts da Typen mit 12 Bit ADC's. Ich habs selbst noch nicht geschafft, aber Microchip gibt da ne Summenabtasrate von 100kSamples an. Die dsPIC30-Familie haben ein MAC-Einheit und es gibt bereits eine DSP-Bibliothek zum downloaden. Optimal wäre es, die Dinger in C zu programmieren. Die Sowa von Microchip für die dsPIC30 ist aber nicht billig, Assembler ist kostenlos (in MPLAB integriert). Ob es schon kostenlose Anbieter für C a la GNU gibt weiss ich nicht. Aber leistungsmässig (30MIPS) müssten diese PIC's geeignet sein. Einen DAC haben sie nicht. Der "Zeitraum" des Samplens hängt mehr von der geünschten Auflösung ab. Wenn Du z.B. 128 FFT-Linien willst, brauchst Du dafür 256 Messwerte. Gerhard Gerhard
hi, ich habe heute auch noch einen prof von mir gefragt. er meinte: dsPIC30F3012. der mc soll angeblich FFT 'von haus aus' können. ich hab das aber nirgends gefunden auf der homepage (hab mir das datenblatt noch nicht angesehen) ich hab mir dann mal n überblick verschafft, über die serie, und mich intressiert nun, ob der hier auch FFT 'von haus aus' kann: dsPIC30F6012A. (nur, falls es jemand 'auswendig' weiss, sonst lese ich das datenblatt. :D) die weitere frage, die sich mir zu fourier stellt: also, ich weiss halt nur grundlegendes über fourier. wenn ich normal fourier mache, habe ich bei lang genuger strecke (bei genug werten) (konkretes beispiel: wenn ich 1 sekunde capture bei 44,1 khz) 44100 werte. wenn ich damit fft mache, habe ich nachher ein linien spektrum mit 22050 linien, ja? heisst das dann, das mir die erste linie 1 herz angibt, die 2. linie 2 herz, die 3. linie 3 herz...? bräuchte ich in diesem fall nicht das ganze spektrum? also über 44100 khz? oder was passiert, wenn ich "nur" sagen wir 128 werte nehme? dadurch würden mir ja informationen verloren gehen. danke für deine bisherige antwort, gerhard
Hallo Matthias ich weiss nicht was dein Prof mit "von Haus aus" meint. Grundsätzlich kann jeder Mikroprozessor und jeder Mikrocontroller eine FFT berechnen. Die DSP's haben eine MAC-Einheit, die die Berechnungen von Filtern oder einer FFT beschleunigt ermöglichen. Die dsPIC's von Microchip sind so eine Art Kombination aus normalem uC und einem DSP. Grundsätzlich ist deine Vermutung über die Auflösung einer FFT richtig. Allerings kannst du selbst mit dem "dicksten" dsPIC keine FFT mit 44100 Werten berechnen. Schon deshalb, weil der nur 8k RAM hat. Mehr als 1024 Messwerte dürften da real nicht drin dein, selbst bei einer "in-place-FFT", wo also deine Messwerte mit den Werten der FFT überschrieben werden - da du für andere Aufgaben auch noch Speicher brauchst. Wenn du eine FFT mit 44100 Werten machen willst - um mal bei der Größenordnung zu bleiben, brauchst du ein anderes Kaliber von uC - da musst Du mal bei Freescale schaun (MPC555 oder so), also ein uC, der externes RAM unterstützt (die PIC unterstützen kaum einen externen BUS). Wenn Du nur eine FFT mit 128 Werten machst, ist die Bandbreite der Messwerte größer, das heisst eine Linie repäsentiert einen größeren Bereich. Je höher die Auflösung - also je mehr Werte du hast - desto mehr verwischen die Übergänge. Also so richtig "schöne" Linie bekommt man, wenn man die FFT von 1024 Messwerten oder weniger macht. Gerhard
hallo Gerhard (und die anderen :P), erstmal danke für die kompetente beantwortung meiner fragen. :D ich habe mir das so vorgestellt, das ich das eingangssignal zerlege, abändere, und danach wieder zusammen rechne. wenn ich nun aber recht wenige werte habe, sagen wir 4, dann ist das eher eine schlechte annäherung an das original signal. 128 werte sind zwar wesentlich mehr, als vier, aber vermutlich für einen einigermaßen qualitativen "sound" noch nicht ausreichend. ich habe mir zum spaß ein programm programmiert, was die rechteck schwingung mit vielen überlagerten sinus kurven zeichnet, und mal 128, dann 1024, und dann 44100 "herz" zeichnen lassen. allerdings war (gut, eine rechteckschwingung ist jetzt ein extrem, welches in "musik" so nie vor kommt...) das signal erst schön, als ich eben 22050 mal drüber zeichnen lassen habe. ich habe mich auf die schnelle in den "MPC5554*" verliebt. allerdings scheine ich dort kein sample bestellen zu können (für den mit 2 mb eeprom :D, nur auf anfrage). desweiteren bin ich mir unsicher, was die abtastrate angeht. 1,25 ms scheint mir ziemlich langsam für einen controller der leistungsklasse. bei den anderen modellen (also den restlichen MPC5554*) stand keine abtastrate dabei. welchen von denen hättest du mir empfohlen? wenn ich da FFT mache, und die eh nachher nur 1024 werte schafft, könnte ich eigentlich auch "nur" einen 10 oder 8 bit adc verwenden. :-/ naja, ich werde das mal mit matlab durchprobieren, wie sich der sound "verschlechtert".
Hallo Matthias ich kann keine Empfehlung für einen Freesacle-uC machen, da ich mit denen noch nicht gearbeitet habe. Ich hab mit Audio-Anwendungen keine Erfahrung. Meine Projekte liegen im Bereich Messtechnik. Ich weiss auch nicht, ob die Freescale-Prozessoren hier dann die richtigen sind. Da musst Du dann selbts noch aktiv werden. uC mit ADC's gibt ja zu hauf (Analog Devices, Atmel, Philips, TI) In Bezug auf die Menge an Linien der FFT ist natürlich klar, dass es auf den Zweck der FFT ankommt. Meine Aussage über "maximal 1024 Messwerte oder weniger" war geprägt von der Frequenzanalyse und der dazugehörigen Grafik. Da gewint man nicht mehr wenn man mehr Messpunkte hat. Für die IFFT und der Frequenzsynthese schaut das natürlich dann wieder anders aus. Damit da nicht zuviel verloren geht (sorry, das hab ich beim Durchlesen oben nicht verstanden, was du mit "Informationen verlieren" meinst) und der Klang nicht leidet, brauchts natürlich mehr Frequenzen. Bei der Auswahl des uC oder DSP ist evtl auch zu beachten, ob dieser eine Floatingpoint-Einheit hat. Die kleinen uC, zu denen auch der PIC gehört, haben keine und berechnen die FFT mit ihrer Integer-Einheit. Für mehr Flexibilität ist ein Prozessor (uC, DSP) mit Floatingpoint-Einheit besser - man kann dann auch auf "ordinäre" Programmabeispiele aus dem Web, der in C geschrieben ist, zurückgreifen, oder auf C-Code, der mit Matlab/Simulink erzeugt wurde (hier hören aber meine Kenntnisse auf. Dass man aus Matlab/Simulink C-Code erzeugen kann, kenn ich nur vom Hörensagen). Gerhard
Hi zur Prozessorfrage nur kurz: Es gibt keine Prozessoren die eine FFT Einheit integriert haben. DSPs haben nur spezielle Anweisungen (MAC) und Features (bit-reversed addressing), die eine FFT zusätzlich beschleunigen. Die in den Controllern integrierten DACs und ADCs sind üblicherweise nicht für Audioanwendungen gedacht. Dafür hängt man dann einen günstigen Stereocodec an eine serielle Schnittstelle des DSPs. Die sind günstig und können auch 24bit/96kHz. Der Freescale PowerPC ist utopisch, solange du nicht 6Layer Platinen für extremst viel Geld fertigen und bestücken lassen kannst. Ich lese hier aber deutlich heraus, dass du Anfänger im Bereich der Signalverarbeitung bist. Deswegen paar grundsätzliche Dinge: Equalizer über FFT->Filter->IFFT zu machen ist problematisch, da dein Audiosignal ein kontinurliches Signal ist. Wenn du einen Block nach dem anderen so filterst gibts Sprungstellen zwischen den Blöcken. Die hören sich garantiert ÜBERHAUPT nicht gut an. Hier brauchts geeignete Überlappung und Fensterfunktionen. Das ist nichts für Anfänger behaupte ich mal. Wenn man das System aber verstanden hat ist es unwesentlich ob man 1024 oder 4096 Punkte oder mehr nimmt. das ändert nicht die Genauigkeit des Ausgangsignals (SNR), sondern du bekommst nur ein Filter mit höherer Frequenzselektivität. Einfacher wäre wohl für dich ein FIR Filter zu nutzen. Dazu kannst du die gewünschte Übertragungsfunktion im Frequenzbereich irgendwie definieren und dann über IFFT die dazugehörigen FIR Filterkoeffizienten berechnen. Braucht aber genausoviel Speicher, wenn du Filter für tiefe Frequenzen brauchst. Die andere Möglichkeit sind dann halt noch IIR Filter. Wenig Speicherverbrauch, aber komplexer zu implementieren, und nicht so flexibel. Egal welche Möglichkeit du nimmst, du solltest die Filterung eines Audiosignals auf jedenfall erstmal auf dem PC in Matlab (und wenn das läuft evtl noch in C++) testen. Ich denke erst wenn das läuft solltest du anfangen dir Gedanken zu machen wie man das auf eine embedded Plattform bekommt.
Hallo Matthias, ich würde ebenfalls empfehlen das ganze per Filterung zu machen, da die Blöcke dir sicherlich noch ne ganze Menge "Freude" machen. Ansonsten mit intergrierten ADC DAC fällt mir im Moment nur der ARM7 Controller con AD ein (z.B. ADUM7026 o.ä). Aber ich bin mir ziemlich sicher, daß das mit 44.1 kHz nix werden dürfte mit der Rechnerei. Bei einfachen Filtern vielleicht. Ansonsten wäre ein geeigneter DSP zu wählen. Beim Atmel weiß ich nicht, ob ein DAC drinne ist. Einfacher wird das ganze auch , wenn du einen Floating Point DSP nehmen kannst. Dann gibt es keine Sklalierungsprobleme. Gruß Thomas
Bei den Anforderungen ist ein OS nur zusätzlicher unnötiger Overhead - mit hardwarenaher Programmierung ist es auf dem Ding auch vorbei.
Kann Matthias nur zustimmen. Vor allen Dingen solltest du diesen Satz beherzigen. "Egal welche Möglichkeit du nimmst, du solltest die Filterung eines Audiosignals auf jedenfall erstmal auf dem PC in Matlab (und wenn das läuft evtl noch in C++) testen. Ich denke erst wenn das läuft solltest du anfangen dir Gedanken zu machen wie man das auf eine embedded Plattform bekommt." Und das Thema Allpass könnte auch interessant für dich sein.
Wieso sollte ein ARM7 nicht genügend Rechenleistung haben. Die alte Appnote von ARM gibt für einen ARM7 bei 40MHz für eine komplexe FFT (32bit Integer real, 32bit imaginär) bei 1024Punkten 6.6ms (4.9ms ARM7M) bzw. 33ms(25ms) bei 4096 Punkten an. http://www.renan.org/ARM/doc/Apps16pdf.pdf
Du kanst auch eine 4 Punkt FFT machen und hast noch die volle genauigkeit. Denn alle 4 Sample kanst du dann eine FFT berechnen. Wenn du nun eine IFFT machst hast du die 4 Samples bis auf Rundungsfehler wieder rekonstruiert. Je länger du die FFT machst um so genauer kannst du das Signal filtern. Bei einer 4 Punkt FFT hast du deinen Frequenzbereich z.B. nur in 4 Frequenzbereiche. Du kanst die Grenze deines Filters nicht mehr sehr genau einstellen. Ein problem mit der FFT ist das FFT Fenster nimmst du hier ein Rechteckfenster kannst du mit der IFFT das Signal wieder genau rekonstruieren, die Frequenzen sind aber in den einzelnen Frequenzbereichen nicht mehr so schön getrennt wie man es erwartet. Mit einer anderen Fensterung ist das Signal nicht mehr so einfach zu rekonstruieren. Mfg Michael (FIR Filter sind einfacher) Mfg Michael
hi michael, die frage ist, wenn ich nur über 8 werte vom dac FFT mache, um 4 spektrallinien zu bekommen, welche bereiche dann welche linie abdecken. oder ob ich dann überhaupt niedrige frequenzen feststellen kann. hast du mir ein link zu einer erklärung, etc.?
Habe leider Script nur in Papierform da, aber die üblichen verdächtigen erklären auch schon relativ gut. http://de.wikipedia.org/wiki/Diskrete_Fourier-Transformation http://en.wikipedia.org/wiki/Discrete_Fourier_transform Die FFT ist nur eine Rechenzeitsparende Variante liefert aber das gleiche Ergebnis wie die DFT. Versuche mal zuerst nicht eine FFT zu verstehen, das ist noch viel komplizierter wie eine DFT. Mfg Michael
Nunja, mir geht es ja ersteinmal Primär um die Klärung, ob ich bei einer FFT von nur 4 resultierenden balken diese nachher wirklich frei wählen kann, oder ob diese dann z.B. zwangsweisse 11-22 khz, 5,5-11 khz, 2,5-5,5 khz und 0-2,25 khz oder so abdecken. weil, wenn letzteres z.b. der fall wäre, würden mir auch nur eine fourier analyse über 10/44100 s reichen. und diese dann halt 'obacha oft' hintereinander.
wenn du dir die genannte Seite durchgelesen und verstanden hättest, wüsstest du, dass du bei fs=44.1kHz und 4 Abtastwerten (N=4) im Frequenzbereich Stützstellen bei (0:N-1)/N*44.1kHz hättest, also bei 0Hz, 11.025kHz, 22.05kHz (=-22.05kHz), 33.075kHz (=-11.025kHz). Bei 8 Abtastwerten darfst du jeweils genau zwischen diesen Werten noch einen einfügen. Zu den Zahlenwerten von arc kann man nur sagen, dass diese zeigen, dass der ARM7 es auf jedenfall NICHT schafft, denn von den 4096Punkte FFTs wird man schätzungsweise 20 Stück brauchen, und dann noch die IFFTs dazu. 40x33ms > 1s, und dabei ist noch keine einzige andere Berechnung enthalten, die man aber natürlich auch noch braucht.
Moinsen, bevor hier über notwendige Längen der FFT diskutiert wird, sollte man sich vielleicht auch einmal mit dem Thema Leckeffeckt (wäre eigentlich mal ne Frage für genial daneben;-)) beschäftigen. Ich persönlich glaube, dass der Schritt den du da tun willst, erst einmal zu groß ist. Fang doch erst einmal mit Matlab, an die Sache grundsätzlich zu verstehen. Die Fragen die du stellst und die du noch stellen wirst, sind einfach zu umfangreich für ein Forum. Da gibt es nicht um sonst ganze Bücher drüber. Viele Grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.