Я новичок в обработке сигналов, и я не совсем понимаю основы (и даже больше). Извините заранее за любую ошибку в моем понимании до сих пор.
Я пишу C код для обнаружения базового c сигнала (длительность синусоиды 18 Гц длительностью 2 сек c, генерация которого с помощью Audacity довольно проста) в гораздо больший mp3-файл. Я читаю mp3-файл и копирую его до совпадения со звуковым сигналом.
Соответствующий сигнал - {1-й канал: грех 18 Гц. сигнал, 2 канал: ничего / не имеет значения). Чтобы соответствовать звучанию, я вычисляю частоту mp3, пока не найду хороший процент частоты 18 Гц. в течение ~ 2 сек c. Поскольку эта частота не очень распространена, мне не нужно очень точно сопоставлять ее.
Я использовал mpg123 для преобразования моего файла, я заполняю буферы тем, что он возвращает. Я инициализировал его, чтобы конвертировать mp3 в моно RAW аудио: init:
int ret;
const long *rates;
size_t rate_count, i;
mpg123_rates(&rates, &rate_count);
mpg123_handle *m = mpg123_new(NULL, &ret);
mpg123_format_none(m);
for(i=0; i<rate_count; ++i)
mpg123_format(m, rates[i], MPG123_MONO, MPG123_ENC_SIGNED_32);
if(m == NULL)
{
//err
} else {
mpg123_open_feed(m);
}
(...)
unsigned char out[8*MAX_MP3_BUF_SIZE];
ret = mpg123_decode(m, buf->data, buf->size, out, 8*MAX_MP3_BUF_SIZE, &size);
`(...)
unsigned char out[8*MAX_MP3_BUF_SIZE];
ret = mpg123_decode(m, buf->data, buf->size, out, 8*MAX_MP3_BUF_SIZE, &size);
(...) `
Но я должен представить, как получить результирующий буфер для вычисления БПФ, чтобы получить частоту.
//FREQ Calculation with libfftw3
int transform_size = MAX_MP3_BUF_SIZE * 2;
fftw_complex *fftout = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * transform_size);
fftw_complex *fftin = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * transform_size);
fftw_plan p = fftw_plan_dft_r2c_1d(transform_size, fftin, fftout, FFTW_ESTIMATE);
Я могу получить хороший RAW Audio (PCM?) В буфер (если я напишу его, его можно прочитать и преобразовать в волну с помощью sox: sox --magi c -r 44100 -e подписано -b 32 - c 1 rps.raw rps.wav
Любая помощь приветствуется. Мои знания по обработке сигналов плохие, я даже не уверен, что делать с БПФ, чтобы получить частота сигнала. Код просто fyi, он содержится в гораздо большем проекте (для которого просто grep не вариант)