FFT mit hilfe der DSP Library durchführen
Donnerstag, 23. Februar 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  FFT mit hilfe der DSP Library durchführen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: FFT mit hilfe der DSP Library durchführen  (Gelesen 119 mal)
 
corpsman
Newbie
*
Offline Offline

Beiträge: 8


Profil anzeigen WWW
« am: Januar 24, 2012, 12:05:47 »

Guten Morgen Allerseits,

Ich versuche zur Zeit ( leider ohne Erfolg ) die dsp Library zur Nutzung der FFT in Betrieb zu nehmen, doch leider funktionier nicht sehr viel.

Mein Ziel ist folgendes : 128 Unsigned Int Werte ( entsprechen einem Abgetasteten Signal ) FFT-Transformieren und danach eine ganz normale Analyse

Die Theoretischen Angelegenheiten der FFT sind mir Bekannt, es geht mir lediglich um die Techische Umsetzung.

Als Hardware habe ich mir ein PicKit3 mit entsprechendem MPLab 8.83 und einem dsPic33EP512MU810 sowie allem notwendigen zur Inbetriebnahme organisiert.

Die Dsp Library habe ich eingebunden und stecke nun darin die Twiddle Faktoren zu berechnen. Dies scheint mir auch zumindest Teilweise gelungen zu sein, vergleiche ich die Hex gabe meiner Berechneten Twiddles mit denen die im C-Sample von Microchip hinterlegt sind sehen sie "ähnlich" aus, aber eben nicht gleich ( meine sind ab ca. der Hälfte alle 0). Rufe ich dann jedoch die FFT Routine mit meinen Verarbeiteten Daten auf Stürzt der dsPIC leider ab. Hier komme ich leider nicht mehr weiter, evtl kann mir jemand hier helfen ??

Hier sind meine FFT Sourcen :
Code:
#define FFT_BLOCK_LENGTH   128     /* = Number of frequency points in the FFT */
#define LOG2_BLOCK_LENGTH  7     /* = Number of frequency points in the FFT */

fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2];


void init_fft(void)
{
  TwidFactorInit(LOG2_BLOCK_LENGTH, &twiddleFactors[0], 0);  // Init Twiddling factors
/* Nur Zur Ausgabe, ob überhaupt was berechnet wurde ..
  int i;
  char buffer[100];
  sprintf(buffer, "Twiddle Faktoren :\r\n");
  uart2if_print(buffer);
  for(i = 0; i < FFT_BLOCK_LENGTH / 4; i++)
  {
    float tmp = twiddleFactors[i].real;
    sprintf(buffer, "%.4X\r\n", (unsigned int)tmp);
    uart2if_print(buffer);
    tmp = twiddleFactors[i].imag;
    sprintf(buffer, "%.4X\r\n", (unsigned int)tmp);
    uart2if_print(buffer);
  }
*/
}

void do_fft(unsigned int * data)
{
  uart2if_print("1\r\n\0"); // - Das hier erreicht die CPU noch
  // Konvert the Input Data to -0.5 .. 0.5 fractional and set the Complex Component to 0.0
  fractcomplex sigCmpx[FFT_BLOCK_LENGTH];
  int i;
  for (i = 0; i < FFT_BLOCK_LENGTH; i++)
  {
    sigCmpx[i].real = ((float)data[i] / 255.0) - 0.5;
    sigCmpx[i].imag = 0.0;
  };
  uart2if_print("2\r\n\0"); // - Das hier erreicht die CPU noch
  FFTComplexIP (LOG2_BLOCK_LENGTH, &sigCmpx[0], &twiddleFactors[0], COEFFS_IN_DATA); // Hier führt die CPU einen Reboot durch
  uart2if_print("3\r\n\0"); // Dieser Code wird nie erreicht

  /*
  // Store output samples in bit-reversed order of their addresses
  BitReverseComplex (LOG2_BLOCK_LENGTH, &sigCmpx[0]);

  // Compute the square magnitude of the complex FFT output array so we have a Real output vetor
  SquareMagnitudeCplx(FFT_BLOCK_LENGTH, &sigCmpx[0], &sigCmpx[0].real);
  char buffer [100];
  sprintf(buffer, "FFT Eingangsdaten :\r\n");
  uart2if_print(buffer);
  for (i = 0; i < FFT_BLOCK_LENGTH; i++)
  {
    sprintf(buffer, "%d:\r\n", data[i]);
    uart2if_print(buffer);
  }
  sprintf(buffer, "FFT Ausgangsdaten :\r\n");
  uart2if_print(buffer);
  unsigned int tmp;
  for (i = 0; i < FFT_BLOCK_LENGTH; i++)
  {
    tmp =  ((sigCmpx[i].real + 0.5) * 255.0);
    sprintf(buffer, "%d:\r\n", tmp);
    uart2if_print(buffer);
  }
//*/

}
Gespeichert

--
Just try it
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.07 Sekunden mit 20 Zugriffen.
 
Top! Top!