Récemment, j'ai essayé de faire des calculs FFT sur ma carte d'évaluation STM32F4-Discovery, puis de l'envoyer au PC. J'ai examiné mon problème - je pense que je fais quelque chose de mal avec les fonctions FFT fournies par le fabricant. J'utilise les bibliothèques CMSIS-DSP. Pour l'instant, j'ai généré des échantillons avec du code (si cela fonctionne correctement, je vais faire un échantillonnage par microphone).Bibliothèques DSP - RFFT - résultats étranges
J'utilise arm_rfft_fast_f32
que mes données vont être flotte dans l'avenir, mais les résultats que je reçois dans mon tableau de sortie sont fous (je pense) - Je reçois des fréquences inférieures à 0.
number_of_samples = 512; (l_probek in code)
dt = 1/freq/number_of_samples
Voici mon code
float32_t buffer_input[l_probek];
uint16_t i;
uint8_t mode;
float32_t dt;
float32_t freq;
bool DoFlag = false;
bool UBFlag = false;
uint32_t rozmiar = 4*l_probek;
union
{
float32_t f[l_probek];
uint8_t b[4*l_probek];
}data_out;
union
{
float32_t f[l_probek];
uint8_t b[4*l_probek];
}data_mag;
union
{
float32_t f;
uint8_t b[4];
}czest_rozdz;
/* Pointers ------------------------------------------------------------------*/
arm_rfft_fast_instance_f32 S;
arm_cfft_radix4_instance_f32 S_CFFT;
uint16_t output;
/* ---------------------------------------------------------------------------*/
int main(void)
{
freq = 5000;
dt = 0.000000390625;
_GPIO();
_LED();
_NVIC();
_EXTI(0);
arm_rfft_fast_init_f32(&S, l_probek);
GPIO_SetBits(GPIOD, LED_Green);
mode = 2;
//----------------- Infinite loop
while (1)
{
if(true)//(UBFlag == true)
for(i=0; i<l_probek; ++i)
{
buffer_input[i] = (float32_t) 15*sin(2*PI*freq*i*dt);
}
//Obliczanie FFT
arm_rfft_fast_f32(&S, buffer_input, data_out.f, 0);
//Obliczanie modulow
arm_cmplx_mag_f32(data_out.f, data_mag.f, l_probek);
USART_putdata(USART1, data_out.b, data_mag.b, rozmiar);
//USART_putdata(USART1, czest_rozdz.b, data_mag.b, rozmiar);
GPIO_ToggleBits(GPIOD, LED_Orange);
//mode++;
//UBFlag = false;
}
}
}
avez-vous vérifié que votre entrée sa Les échantillons sont-ils corrects pour votre test? Aussi, quelle est la valeur de l_probek? Est-ce 512? –
@DaveS Il semble calculer sur une onde sinusoïdale de test dans 'buffer_input'. – tofro
Concernant cette ligne - Comment avez-vous déterminé l'amplitude de 15? buffer_input [i] = (float32_t) 15 * sin (2 * PI * freq * i * dt); –