VB FFT - застрял понимание отношения результатов к частоте - PullRequest
3 голосов
/ 26 сентября 2008

Пытаюсь понять процедуру fft (быстрое преобразование Фурье), которую я использую (кража) (переработка)

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

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

Частота дискретизации составляет 1000 образцов / с. Генерация набора сэмплов при 10 Гц.

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

пиковое значение в массиве fft по индексу 6 (исключая огромное значение в 0)

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

Частота дискретизации составляет 8000 образцов / с Генерация набора сэмплов при 440 Гц

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

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

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

Как соотнести индекс пика в массиве БПФ с частотой?

Ответы [ 8 ]

2 голосов
/ 02 октября 2008

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

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

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

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

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

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

> 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

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

 [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
2 голосов
/ 02 октября 2008

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

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

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

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

1 голос
/ 04 января 2009

Другой способ - создать Алгоритм Гертцеля каждой центральной частоты ноты, которую вы ищете.

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

Алгоритм Гертцеля в основном представляет собой одноэлементное БПФ. Используя этот метод, вы можете поместить свои бункеры логарифмически, как обычно идут музыкальные ноты.

Псевдокод из Википедии:

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 выборкам выходной мощности, указывающим относительный уровень в этом частотном интервале.

1 голос
/ 02 октября 2008

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

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

альтернативный текст http://home.comcast.net/~kootsoop/images/SINE1.jpg

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

альтернативный текст http://home.comcast.net/~kootsoop/images/SINE2.jpg

Таким образом, ваши ответы кажутся правильными относительно местоположения пика.

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

1 голос
/ 02 октября 2008

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

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

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

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

1 голос
/ 26 сентября 2008

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

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

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

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

1 голос
/ 26 сентября 2008

Прошло много времени с тех пор, как я сделал БПФ, но вот что я помню

БПФ обычно принимает комплексные числа в качестве входа и выхода. Так что я не совсем уверен, как действительная и мнимая части ввода и вывода отображаются в массивы.

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

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

0 голосов
/ 03 апреля 2009

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

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

-Rick

...