Forum: Digitale Signalverarbeitung / DSP / Machine Learning [SUCHE] Microcontroller mit 2x ADC, 2x DAC und FFT


von Matthias Lukaseder (Gast)


Lesenswert?

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?

von Gerhard (Gast)


Lesenswert?

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

von Matthias Lukaseder (Gast)


Lesenswert?

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

von Gerhard (Gast)


Lesenswert?

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

von Matthias Lukaseder (Gast)


Lesenswert?

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".

von Gerhard (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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

von Colin (Gast)


Lesenswert?

Nimm einen PC im ITX Format vom Reichelt.

von Alex (Gast)


Lesenswert?

Bei den Anforderungen ist ein OS nur zusätzlicher unnötiger Overhead -
mit hardwarenaher Programmierung ist es auf dem Ding auch vorbei.

von Björn (Gast)


Lesenswert?

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.

von arc (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Matthias Lukaseder (Gast)


Lesenswert?

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.?

von Michael (Gast)


Lesenswert?

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

von Matthias Lukaseder (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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.

von Björn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.