Я пытаюсь захватить поток аудио с помощью SDL, а затем передать его поцелую, чтобы выяснить, какая частота является наиболее доминирующей в сигнале. Однако я всегда получаю 3986 в качестве позиции в БПФ с наиболее доминирующей синусоидой, независимо от того, какой сигнал является входящим звуком. Я знаю, что на самом деле получаю аудиосигнал, потому что я могу видеть изменение громкости при изменении сигнала (я использую клавиатуру для генерации аудиосигнала)
#include "SDL.h"
#include "kiss_fftr.h"
#include <stdlib.h>
#define NUM_SAMPLES 4096
#define INPUT_DEVICE "Built-in Audio Analog Stereo"
volatile kiss_fftr_cfg kiss_cfg;
volatile int audio_count=0;
//This is what takes each audio sample and process it as an FFT
void AudioCallback(void* userdata, uint8_t *stream, int len1){
int audioVal =0;
kiss_fft_scalar in[NUM_SAMPLES];
int maxSamp =0, minSamp =0;
for(int i=0; i<len1; i++){`enter code here`
int val = (int8_t)stream[i];
maxSamp = (maxSamp < val) ? val :maxSamp;
minSamp = (minSamp < val)? minSamp : val;
int thisVal = stream[i] -128;
if(thisVal < 0)
thisVal = -1 * thisVal;
audioVal += thisVal;
in[i] = thisVal;
}
kiss_fft_cpx out[NUM_SAMPLES];
kiss_fftr(kiss_cfg, in, out);
long long int max = 0;
int maxPos = -1;
for(int i=0; i<NUM_SAMPLES; i++){
unsigned int thisVal = abs(out[i].r);
if(max <= thisVal){
maxPos = i;
max=thisVal;
}
}
printf("Max pos %7d, max val %15d audioval %15d| samples %d, %d %d %d\n", maxPos, max, audioVal, len1, NUM_SAMPLES, maxSamp, minSamp);
audio_count++;
}
//In here I both set up kissfft and SDL
int main(int argc, char* argv[]){
SDL_Init(SDL_INIT_AUDIO);
int i, count = SDL_GetNumAudioDevices(0);
printf("Found %d audio devices \n", count);
if(0 > count){
printf("Got this error %s\n", SDL_GetError());
}
for (i = 0; i < count; ++i) {
printf("Audio device %d: %s\n", i, SDL_GetAudioDeviceName(i, 0));
}
kiss_cfg = kiss_fftr_alloc(NUM_SAMPLES, 0, NULL, NULL);
SDL_AudioSpec want, have;
SDL_memset(&want, 0, sizeof(want)); /* or SDL_zero(want) */
want.freq = 48000;
want.format = AUDIO_U8;
want.channels = 1;
want.samples = NUM_SAMPLES;
want.callback = AudioCallback;
SDL_AudioDeviceID devId = SDL_OpenAudioDevice(INPUT_DEVICE, 1, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);
if(0 == devId)
{
printf("Failed to open %s\n", INPUT_DEVICE);
exit(1);
}
//SDL_LockAudioDevice(devId);
SDL_PauseAudioDevice(devId, 0);
while(1){
SDL_Delay(10);
}
SDL_UnlockAudioDevice(devId);
SDL_CloseAudioDevice(devId);
}
Я ожидаю, что maxpos изменится в зависимости от того, какую клавишу я нажимаю на клавиатуре, но вместо этого я всегда получаю «Max pos 3986»