Как обнаружить базовый c аудиосигнал в гораздо больший (выходной сигнал mpg123) - PullRequest
1 голос
/ 30 марта 2020

Я новичок в обработке сигналов, и я не совсем понимаю основы (и даже больше). Извините заранее за любую ошибку в моем понимании до сих пор.

Я пишу 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 не вариант)

1 Ответ

0 голосов
/ 01 апреля 2020

Не используйте MP3 для этого. Есть большая вероятность, что ваши 18 Гц исчезнут или, по крайней мере, искажатся. 18 Гц будет ниже слышимого. MP3 и другие алгоритмы с потерями используют различные методы для удаления звуков, которые мы не собираемся слышать.

Если предполагается PCM, поскольку вам нужен только один диапазон частот, рассмотрите возможность использования алгоритма Goertzel, Это более эффективно, чем FFT / DFT для вашего случая использования.

...