2008-09-26 5 views
3

Пытаясь понять БПФ (быстрое преобразование Фурье) подпрограмма Я использую (кражу) (переработка)В.Б. FFT - застряло понимание отношение результатов к частоте

ввода является массивом точек данных 512, которые являются образцом Форма волны. Данные теста сгенерированы в этот массив. fft преобразует этот массив в частотную область. Попытка понять взаимосвязь между частотой, периодом, частотой дискретизации и положением в массиве fft. Я приведу примеры:

===================================================================================================================================================== =

Частота выборки составляет 1000 образцов/с. Создайте набор выборок на частоте 10 Гц.

Входной массив имеет пиковых значений при обр (28), обр (128), обр (228) ... период = 100 точек выборки

пиковое значение в массиве FFT имеет индекс 6 (за исключением огромный значение в точке 0)

========================================

частота дискретизации 8000 выборок/с Генерировать набор образцов при 440Hz

пиковые значения входного массива включают обр (7), обр (25), обр (43), обр (61) ... период = 18 точек выборки

пиковое значение в массиве FFT имеет индекс 29 (за исключением огромное значение в 0)

=============== =========================

Как связать индекс пика в массиве fft с частотой?

ответ

2

Если вы игнорируете мнимой части, распределение частот линейна по бункерах:

Частота @ я = (частота дискретизации/2) * (я/Nbins).

Итак, для вашего первого примера, если у вас было 256 ящиков, самый большой бит соответствует частоте 1000/2 * 6/256 = 11,7 Гц. Поскольку ваш вход был 10 Гц, я бы предположил, что бит 5 (9,7 Гц) также имел большой компонент. Чтобы получить лучшую точность, вам нужно взять больше образцов, чтобы получить меньшие ящики.

Ваш второй пример дает 8000/2 * 29/256 = 453 Гц. Опять же, близко, но вам нужно больше бункеров. Ваше разрешение здесь только 4000/256 = 15,6 Гц.

1

Это было некоторое время, так как я сделал FFT, но вот что я помню

FFT обычно принимает комплексные числа, как вход и выход. Поэтому я не совсем уверен, как реальная и мнимая часть входных и выходных карт массивов.

Я действительно не понимаю, что вы делаете. В первом примере вы говорите, что обрабатываете буферы выборки с частотой 10 Гц для частоты дискретизации 1000 Гц? Таким образом, вы должны иметь 10 буферов в секунду с 100 образцами каждый. Я не понимаю, как ваш входной массив может составлять не менее 228 выборок.

Обычно первая половина выходного буфера представляет собой частотные бункеры с частотой 0 (= смещение постоянного тока) до 1/2 частоты дискретизации. а вторая половина - отрицательные частоты. если ваш вход - это только реальные данные с 0 для мнимого сигнала, положительные и отрицательные частоты одинаковы. Соотношение реального/мнимого сигнала на выходе содержит информацию о фазе от вашего входного сигнала.

1

Я немного ржавый тоже по математике и обработке сигналов, но с дополнительной информацией я могу дать ему выстрел.

Если вы хотите знать энергию сигнала на каждый бит, вам нужна величина сложного выхода. Так что просто смотреть на реальный результат недостаточно. Даже когда ввод представляет собой только реальные числа. Для каждого бина величина выхода равна sqrt (real^2 + imag^2), как и pythagoras :-)

Бутылки от 0 до 449 - это положительные частоты от 0 Гц до 500 Гц. от 500 до 1000 - отрицательные частоты и должны быть такими же, как положительный для реального сигнала.Если вы обрабатываете один буфер, каждая вторая частота и индексы массивов выстраиваются красиво. Таким образом, пик с индексом 6 соответствует 6 Гц, так что это немного странно. Возможно, это связано с тем, что вы смотрите только на реальные выходные данные, а реальные и мнимые данные объединяются, чтобы дать ожидаемый пик с индексом 10. Частоты должны линейно отображаться на бункерах.

Пики на 0 указывают смещение постоянного тока.

1

Частота для bin i равна i * (samplerate/n), где n - количество выборок в окне ввода FFT.

Если вы обрабатываете звук, так как шаг пропорционален журналу частоты, разрешение по высоте бункера увеличивается с увеличением частоты - трудно точно разрешить низкочастотные сигналы. Для этого вам нужно использовать более крупные окна FFT, что уменьшает временное разрешение. Существует компромисс частоты против временного разрешения для заданной частоты дискретизации.

Вы упомянули бит с большим значением в 0 - это бит с частотой 0, т. Е. Компонент постоянного тока. Если это велико, то, предположительно, ваши значения в целом положительны. Бин n/2 (в вашем случае 256) - частота Найквиста, половина частоты дискретизации, которая является самой высокой частотой, которая может быть разрешена в дискретизированном сигнале с такой скоростью.

Если сигнал вещественный, то ячейки n/2 + 1 до n-1 будут содержать комплексные сопряжения бункеров n/2-1 до 1 соответственно. Значение постоянного тока появляется только один раз.

2

Было бы полезно, если бы вы предоставили свой образец данных.

Я предполагаю, что у вас есть так называемые артефакты выборки. Сильный сигнал при DC (частота 0) предполагает, что это так.

Вы всегда должны убедиться, что среднее значение в ваших входных данных равно нулю - найти среднее значение и вычесть его из каждой точки выборки, прежде чем использовать fft - хорошая практика.

Вдоль тех же линий вы должны быть осторожны с артефактом окна пробоотбора. Важно, чтобы первая и последняя точки данных были близки к нулю, потому что в противном случае «шаг» извне внутрь окна выборки имеет эффект впрыскивания большого количества энергии на разных частотах.

Суть в том, что для проведения анализа fft требуется больше внимания, чем просто утилизация найденной где-то обычной программы fft.

Вот первые 100 точек выборки сигнала 10Hz, как описано в этом вопросе, массируют, чтобы избежать артефактов выборки

 
> sinx[1:100] 
    [1] 0.000000e+00 6.279052e-02 1.253332e-01 1.873813e-01 2.486899e-01 3.090170e-01 3.681246e-01 4.257793e-01 4.817537e-01 5.358268e-01 
[11] 5.877853e-01 6.374240e-01 6.845471e-01 7.289686e-01 7.705132e-01 8.090170e-01 8.443279e-01 8.763067e-01 9.048271e-01 9.297765e-01 
[21] 9.510565e-01 9.685832e-01 9.822873e-01 9.921147e-01 9.980267e-01 1.000000e+00 9.980267e-01 9.921147e-01 9.822873e-01 9.685832e-01 
[31] 9.510565e-01 9.297765e-01 9.048271e-01 8.763067e-01 8.443279e-01 8.090170e-01 7.705132e-01 7.289686e-01 6.845471e-01 6.374240e-01 
[41] 5.877853e-01 5.358268e-01 4.817537e-01 4.257793e-01 3.681246e-01 3.090170e-01 2.486899e-01 1.873813e-01 1.253332e-01 6.279052e-02 
[51] -2.542075e-15 -6.279052e-02 -1.253332e-01 -1.873813e-01 -2.486899e-01 -3.090170e-01 -3.681246e-01 -4.257793e-01 -4.817537e-01 -5.358268e-01 
[61] -5.877853e-01 -6.374240e-01 -6.845471e-01 -7.289686e-01 -7.705132e-01 -8.090170e-01 -8.443279e-01 -8.763067e-01 -9.048271e-01 -9.297765e-01 
[71] -9.510565e-01 -9.685832e-01 -9.822873e-01 -9.921147e-01 -9.980267e-01 -1.000000e+00 -9.980267e-01 -9.921147e-01 -9.822873e-01 -9.685832e-01 
[81] -9.510565e-01 -9.297765e-01 -9.048271e-01 -8.763067e-01 -8.443279e-01 -8.090170e-01 -7.705132e-01 -7.289686e-01 -6.845471e-01 -6.374240e-01 
[91] -5.877853e-01 -5.358268e-01 -4.817537e-01 -4.257793e-01 -3.681246e-01 -3.090170e-01 -2.486899e-01 -1.873813e-01 -1.253332e-01 -6.279052e-02 

А вот результирующие абсолютные значения частотной области FFT

 
[1] 7.160038e-13 1.008741e-01 2.080408e-01 3.291725e-01 4.753899e-01 6.653660e-01 9.352601e-01 1.368212e+00 2.211653e+00 4.691243e+00 5.001674e+02 
[12] 5.293086e+00 2.742218e+00 1.891330e+00 1.462830e+00 1.203175e+00 1.028079e+00 9.014559e-01 8.052577e-01 7.294489e-01 
1

Образцы, как говорили другие, равномерно распределены в частотной области (не логарифмической).

К примеру 1, вы должны получить это:

alt text http://home.comcast.net/~kootsoop/images/SINE1.jpg

Для другого примера вы должны получить

alt text http://home.comcast.net/~kootsoop/images/SINE2.jpg

Так ваши ответы как представляется, правильно относительно пикового местоположения ,

То, что я не получаю, это большой компонент постоянного тока. Вы уверены, что генерируете синусоидальную волну в качестве входного сигнала? Входит ли вход отрицательный? Для синусоиды DC должен быть близок к нулю, если вы получаете достаточно циклов.

1

Другой аспект заключается в создании Goertzel's Algorithm каждой частоты центра заметок, которую вы ищете.

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

Алгоритм Goertzel - это в основном одиночный бит FFT. Используя этот метод, вы можете поместить свои лотки логарифмически, так как музыкальные ноты естественно идут.

Некоторые псевдокод из Википедии:

s_prev = 0 
s_prev2 = 0 
coeff = 2*cos(2*PI*normalized_frequency); 
for each sample, x[n], 
    s = x[n] + coeff*s_prev - s_prev2; 
    s_prev2 = s_prev; 
    s_prev = s; 
end 
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev; 

Две переменные, представляющие предыдущие два образца сохраняются для следующей итерации. Это можно затем использовать в потоковой программе. Я думаю, возможно, расчет мощности должен быть внутри цикла. (Однако он не изображен как таковой в статье Wiki.)

В случае обнаружения тона было бы 88 различных коэффициентов, 88 пар предыдущих образцов и приводило бы к 88 образцам выходной мощности, указывающим относительный уровень на этой частоте бен.

0

WaveyDavey говорит, что он захватывает звук с микрофона через аудиооборудование своего компьютера, НО его результаты не имеют нулевого значения. Это звучит как проблема с оборудованием. Он ДОЛЖЕН быть нулевым.

Когда в комнате тихо, поток значений, поступающих от звукового API, должен быть очень близок к амплитуде 0, с небольшими + - изменениями окружающего шума. Если в комнате присутствует вибрационный звук (например, пианино, флейта, голос), поток данных должен показывать основную синусоидальную волну, которая идет как положительно, так и отрицательно, и составляет около нуля. Если это не так, в системе есть фанк!

-Rick

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

  • Нет связанных вопросов^_^