Wie funktioniert ein Spectrum Analyzer

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 27 11 2024  19:30:52      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( Vorherige Seite 1 | 2 )      


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
Zur Homepage von Henne02

 

  

...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
Zur Homepage von Henne02

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
Zur Homepage von Henne02


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


Vorherige Seite      
Gehe zu Seite ( Vorherige Seite 1 | 2 )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 182414298   Heute : 6283    Gestern : 7797    Online : 225        27.11.2024    19:30
9 Besucher in den letzten 60 Sekunden        alle 6.67 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0419600009918