2013-11-12 3 views
0

Я видел много сообщений здесь о частотном анализе и, казалось, очень помог мне, , но я попытался записать свой голос и распечатать частоту и кажется, что значения не имеют отношения к тому, что записано, попытался поднять мой голос вверх и вниз, чтобы узнать, что происходит с значениями частоты, , но частота, напечатанная, как вы можете видеть в логарифмическом сообщении, имеет свою собственную волю, возможно, причину фонового шума :)Анализ частоты FFT, кажется, ошибочно.

Вот код, как я получаю от частоты:

fftArray = FFT.fft(fftTempArray); 

MAX = 0; 
int index= 0; 
for (int i = 0; i < fftArray.length/2; i++) { 
    if (fftArray[i].magnitudes() > MAX) { 
     MAX = fftArray[i].magnitudes(); 
     index = i;      
    } 
    double freq = index * sampleFreq/fftArray.length; 
    System.out.println(freq); 
} 

Вот LogCat:

11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:40.678: I/System.out(23397): 150.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 0.0 
11-12 16:01:41.409: I/System.out(23397): 64.0 
11-12 16:01:41.409: I/System.out(23397): 75.0 
11-12 16:01:41.409: I/System.out(23397): 75.0 
11-12 16:01:41.409: I/System.out(23397): 75.0 
11-12 16:01:41.419: I/System.out(23397): 107.0 
11-12 16:01:41.419: I/System.out(23397): 118.0 
11-12 16:01:41.419: I/System.out(23397): 118.0 
11-12 16:01:41.419: I/System.out(23397): 118.0 
11-12 16:01:41.419: I/System.out(23397): 118.0 
11-12 16:01:41.419: I/System.out(23397): 161.0 
11-12 16:01:41.419: I/System.out(23397): 161.0 
11-12 16:01:41.419: I/System.out(23397): 161.0 
11-12 16:01:41.419: I/System.out(23397): 161.0 

Это не остается на этом диапазоне значений независимо от того, что я делаю.

Не могли бы вы помочь? Как может случиться так, что частота не меняется, когда я делаю звуки высокого тона или различные типы шумов для микрофона?

+1

Вы перешли на полярные координаты? Я не понимаю, каков будет ваш выход в журнал. – Radiodef

+0

ваш журнал странный, почему он в цикле? – njzk2

+0

Что вы используете? Ваш собственный или один из другого места? Что такое массив, который возвращается? Я не думаю, что вы действительно дали достаточно информации, чтобы быть в состоянии сказать, что неправильно (если что-нибудь). – Radiodef

ответ

0

Вы неверно конвертируете из индекса FFT в частоту от второй до последней строки кода. Это должно быть:

double freq = index * sampleFreq * 2/fftArray.length; 

Кроме этого, ваш код в порядке (насколько я могу видеть). Попробуйте изолировать ошибку, запустив некоторые тестовые данные через ваш код и некоторый тестовый звук через ваш микрофон. Audacity - это полезная программа для просмотра спектрограмм аудио, BTW.

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

+2

Судя по тому, как цикл OP для цикла работает от 0 до fftArray.length/2, я предполагаю, что преобразование не отбросило отрицательные частоты. В этом случае они не должны удваивать частоты. – Radiodef

+0

текущая частота выборки из этого примера равна 44100, поэтому должно быть хорошо, я не уверен, что значит удвоить частоты. Мне очень сложно понять, почему это происходит, попытался взять определенную частоту и поставить рядом с микрофоном, чтобы увидеть отклонение, но не повезло там ... – Er85

+0

@ Radiodef, вы правы, говоря это, но я не знаю многих преобразований, которые это делают. Если бы это было сделано, это технически было бы неправильной реализацией БПФ. В любом случае вы все равно будете перебирать петлю fftArray.length/2 раза – laurie

0

Возможно, вы сбиваете с толку пик частотного спектра. Хотя они оба имеют одинаковые размерные единицы (Гц), Pitch - это психоакустические явления, которые могут сильно отличаться от спектрального пика (который часто намного выше и меняет обертон тона, иногда слегка негармоничность и т. Д.). Таким образом, методы определения/оценки тона отличаются от оценки пикового значения частоты FFT.

+0

Ну, может быть, я сбиваю с толку, разве частота не должна быть выше, если я делаю более высокий звук? так как его вибрация звуковой волны в секунду.Разумеется, я знаю изменения в шаге, но частота также должна измениться./ – Er85

+0

Возможный момент здесь станет ясным, если вы построили весь частотный спектр в несколько моментов времени. Просто взгляд на самый сильный пик может ввести в заблуждение. –

+0

@ Er85: Нет, пиковая частота может опускаться ниже, что делает более высокий звук. Например, пик может быть совсем другим (намного более низким) обертоном. – hotpaw2

Смежные вопросы