Autor |
Wie funktioniert ein Spectrum Analyzer |
|
|
|
|
BID = 104470
Benedikt Inventar
Beiträge: 6241
|
|
google mal nach FFT, du wirst einige C Routinen finden.
Externes RAM brauchst du nicht (ist auch zu langsam), 512Bytes oder 1k (z.B. bei einem ATmega8) reichen.
Mit etwas Glück schaffst du es, 1 Messung pro Sekunde hinzubekommen. FFT ist leider extrem aufwendig. |
|
BID = 104483
Henne02 Stammposter
Beiträge: 493 Wohnort: Aachen
|
|
...Deswegen meine Winamp-Anregung...
Mathias Asselborn hat auf einer DINA4-Platine mittels AVR UND DSP dieses Projekt bewältigt bekommen.
URL habe ich nicht mehr im Kopf, aber er ist Forumsmitglied!!
Ich denke, er ist der einzige, der Dir helfen kann - und auch nur dann wenn du ein wahrer InformatikGott bist
Viel Erfolg / bzw. vergiss es
Hendrik |
|
BID = 104488
colaturka Neu hier
Beiträge: 30
|
lol
Ich hab den Atmel 89S8252, hat der so ein Wandler eingebaut?
f**ck ey ist das soo schwer??
warum denn??
|
BID = 104494
Benedikt Inventar
Beiträge: 6241
|
Nein, der hat keinen.
Ist auch etwas langsam dafür.
Es ist leider so kompliziert, FFT ist zwar (relativ)einfach, erfordert aber sehr viel Rechenaufwand, und das dauert auf so langsamen Controllern...
|
BID = 104517
colaturka Neu hier
Beiträge: 30
|
ok, welcher controller ist der beste? dann kaufe ich halt so einen
|
BID = 104519
Benedikt Inventar
Beiträge: 6241
|
Ein ATmega8 wäre ganz gut. Ist relativ schnell (16MIPS), klein (28 Pins) und hat mehrer AD Wandler.
Besser wäre natürlich ein 16bit Controller (z.B. M16C) oder ein DSP, aber das wird alles teurer und schwieriger.
In Assembler kannst du das ganze vergessen, C ist zwingend notwendig, (es sei denn du bist ein Porgrammiergott).
Erwarte aber kein perfektes Ergebnis, und einfach wird es auch nicht.
[ Diese Nachricht wurde geändert von: Benedikt am 21 Sep 2004 18:54 ]
|
BID = 104554
colaturka Neu hier
Beiträge: 30
|
kann ich das auch so teils teils machen,
weil ich mach das als schul projekt, und assembler kommt im abi, und C leider ned. Das beste wäre halt das ich alles außer das FFT in C proggn könnte und den rest in asm... geht das überhaupt???
|
BID = 104591
Benedikt Inventar
Beiträge: 6241
|
Ich würde alles in C machen, denn außer der FFT Routine musst du nur den AD Wandler abfragen und in ein Array schreiben. Da bringt Assembler keine Vorteile, höchstens Nachteile, da du nicht weiß wie und wo dein Array angeordnet ist (vor allem wenn du Fließkomma verwendest).
Die LCD oder LED Ausgabe macht in Assembler auch wenig Sinn.
Dies ist eines der wenigen Projekte, bei dem sogar ich C verwenden würde, obwohl ich bisher kein Programm für 8051 oder einen AVR in C geschrieben habe, bisher nur in Assembler...
|
BID = 104651
colaturka Neu hier
Beiträge: 30
|
uii da is was drann!!
ich muss mir des nochmal überlege, hätte ned gedacht dass es soo schwer werden kann in ASM....
|
BID = 104662
Benedikt Inventar
Beiträge: 6241
|
Ich habs schonmal probiert, hab aber nach 10% nach 2 Stunden mit Kopfschmerzen es sein lassen.
Hier mal der C Code der FFT Routine:
Im Array Buffer (Länge 1,2,4,8..., je nach gewünschter Auflösung. Je höher, deste größer die benötige Rechenzeit.) werden die gemessenen Werte des ADC übergeben, und man erhält die einzelnen Intensitäten der Frequenzen zurück.
void FFT (char Lang)
{ const float pi=3.1415926535;
char m;
float th,ag,wr,wi,t,s,c,cr,ci,ar,ai,br,bi;
unsigned int n,k1,k2,nk,n1,n2,i,k,j,j1,j2,e1,e2,o1,o2,dr,di,ei,ej,l;
m = Lang - 1;
n = pow(2,m);
k2 = 1;
for (k=1; k<=m; k++)
{k2 = 2 * k2;
k1 = k2 / 2;
th = (2 * pi / n) * k1;
nk = n / k2;
n1 = n / k1;
for (i=1; i<=nk;i++)
{ag = (i - 1) * th;
wr = cos(ag);
wi = 0-sin(ag);
for (j=n1; j<=n;j+=n1)
{j1 = j - n1 + (i - 1);
j2 = j1 + nk;
e1 = 2 * j1;
e2 = 2 * j2;
o1 = e1 + 1;
o2 = e2 + 1;
dr = Buffer[e1] - Buffer[e2];
di = Buffer[o1] - Buffer[o2];
Buffer[e1] = Buffer[e1] + Buffer[e2];
Buffer[o1] = Buffer[o1] + Buffer[o2];
Buffer[e2] = wr * dr - wi * di;
Buffer[o2] = wi * dr + wr * di;
}
}
}
j = 0;
for (i=0; i<=n-2; i++)
{
if (i < j)
{ei = 2 * i;
ej = 2 * j;
t = Buffer[ei];
Buffer[ei] = Buffer[ej];
Buffer[ej] = t;
t = Buffer[i + 1];
Buffer[ei + 1] = Buffer[ej + 1];
Buffer[ej + 1] = t;
}
k = n / 2;
AGAIN:
if (k > j)
j = j+ k;
else
{j = j - k;
k = k / 2;
goto AGAIN;
}
}
t = Buffer[0] + Buffer[1];
Buffer[1] = Buffer[0] - Buffer[1];
Buffer[0] = t;
Buffer[n + 1] = 0-Buffer[n + 1];
n2 = 2 * n;
for (k = 1; k<=n / 2 - 1; k++);
{k2 = 2 * k;
nk = n2 - k2;
ar = Buffer[k2] + Buffer[nk];
ai = Buffer[k2 + 1] - Buffer[nk + 1];
br = Buffer[nk] - Buffer[k2];
bi = 0-Buffer[nk + 1] - Buffer[k2 + 1];
s = sin(k * pi / n);
c = cos(k * pi / n);
cr = br * s - bi * c;
ci = br * c + bi * s;
Buffer[k2] = (ar + cr) / 2;
Buffer[k2 + 1] = (ai + ci) / 2;
Buffer[nk] = (ar - cr) / 2;
Buffer[nk + 1] = (ci - ai) / 2;
}
for (l = 0; l<=n - 1; l++)
Buffer[l] = Buffer[2 * l] * Buffer[2 * l] + Buffer[2 * l + 1] * Buffer[2 * l + 1] + 1;
}
|
BID = 104758
Henne02 Stammposter
Beiträge: 493 Wohnort: Aachen
|
Trigon.Funktionen im AVR?!?
-> lookUp-Table? -> Speicherfresser
Nehmt's mir nicht übel aber wenn ich so in meine Glaskugel sehe, erahne ich ein Scheitern
Grüße, der -leider nicht sehr konstruktive - Hendrik
|
BID = 104773
Jornbyte Moderator
Beiträge: 7178
|
@Hendrik
haste einen besseren vorschlag?
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 104809
Benedikt Inventar
Beiträge: 6241
|
Zitat :
Henne02 hat am 21 Sep 2004 23:01 geschrieben :
|
Trigon.Funktionen im AVR?!?
-> lookUp-Table? -> Speicherfresser
Nehmt's mir nicht übel aber wenn ich so in meine Glaskugel sehe, erahne ich ein Scheitern
|
Wenn dir langweilig ist und du mit 1 Ergebnisn pro 10s zufrieden bist, kannst du sin und cos jedesmal neu ausrechnen, dauert halt jedesmal ein paar ms, oder man baut sich eine 256-1024 Byte große Tabelle für sind. cos lässt sich daraus leicht berechnen.
PS: Die LUT wird kleiner als die sin und cos Funktionen !
Und das ganze läuft schon aus einem ATmega...
|
BID = 104830
Henne02 Stammposter
Beiträge: 493 Wohnort: Aachen
|
Zitat :
| haste einen besseren vorschlag? |
Mathias Asselborn kontaktieren.
DSP einsetzen.
Das Rad nicht neu erfinden
Allerdings: wenn das alles schon werkelt: Herzlichen Glückwunsch!! Benedikt, du hast mir doch vor kurzem einen Link zu Filtern auf AVR gegeben... Ist da nicht was passendes bei. Für den Tiefpass braucht man doch eine FFT, oder?
Ansonsten finde ich immer noch die Winamp-Analyse am Einfachsten.
Grüße, hendrik
|