------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <kiss_fft.h>
#include <tools/kiss_fftr.h>
#define NUM_FFT 256
int main()
{
float samples[NUM_FFT];
// si crea un segnale fittizio
for (int i = 0; i < NUM_FFT; i++) {
samples[i] = sin(i*0.1);
// con questo incremento si che i varia da 0 a 25.6 rad
// ovvero circa 4 volte 2pigreco (ovvero 4 circonferenze)
}
int isinverse = 1;
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_in[NUM_FFT];
kiss_fft_cpx fft_out[NUM_FFT];
kiss_fft_cpx fft_reconstructed[NUM_FFT];
kiss_fftr_cfg fft = kiss_fftr_alloc(NUM_FFT ,0 ,0,0);
kiss_fftr_cfg ifft = kiss_fftr_alloc(NUM_FFT,isinverse,0,0);
// azzera le matrici
for (int i = 0; i < NUM_FFT; i++) {
fft_in[i].r = zero;
fft_in[i].i = zero;
fft_out[i].r = zero;
fft_out[i].i = zero;
fft_reconstructed[i].r = zero;
fft_reconstructed[i].i = zero;
}
//inserisce i campioni nella parte reale della matrice di input
for (int i = 0; i < NUM_FFT; i++) {
fft_in[i].r = samples[i];
fft_in[i].i = zero;
fft_out[i].r = zero;
fft_out[i].i = zero;
}
kiss_fftr(fft, (kiss_fft_scalar*) fft_in, fft_out);
kiss_fftri(ifft, fft_out, (kiss_fft_scalar*)fft_reconstructed);
// calcolo della potenza
for (int i = 0; i < NUM_FFT/2; i++) {
samples[i] = sqrt((fft_out[i].i*fft_out[i].i)+(fft_out[i].i*fft_out[i].i))/(NUM_FFT*2);
printf("%.6f\n\r", samples[i]);
}
printf("Terminato!\n\r");
return 0;
}
------------------------------------------------------------------------------------------------
Dato input |
Potenza |
Segnale ricostruito |