LINUX.ORG.RU

Понимание преобразования Фурье

 ,


1

3

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

Ряд Фурье http://rghost.ru/53785377/image.png

В другой форме http://rghost.ru/53785428/image.png

Так как все функции уже написанны, юзаю готовую библитотеку для питона numpy

>>> np.fft.fft([1, 2, 1, 0, 1, 2, 1, 0])
array([ 8.+0.j,  0.+0.j,  0.-4.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+4.j,
        0.+0.j])
скормил fft 8 точек искомой функции, получил 8 комплексных чисел вида a + b*j, те можно получить амплитуду для каждой составляющей

A = sqrt(a^2+b^2) (вторая пикча)

А теперь эти амплитуды нужно сопоставить каким-то частотам. Тут я и застрял. По логике вещей частота должна соотвествоать ее индексу в массиве (ω,2ω,3ω)

Но нашлась функция fft.fftfreq, на вход получающая количество точек.

>>> np.fft.fftfreq(8)
array([ 0.   ,  0.125,  0.25 ,  0.375, -0.5  , -0.375, -0.25 , -0.125])
Откуда эти цифры? ЯННП.

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

Доки http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.fft.html#numpy....



Последнее исправление: helium (всего исправлений: 1)

Ответ на: комментарий от dn2010

Но как и почему?

>>> np.fft.fftfreq(8)
array([ 0.   ,  0.125,  0.25 ,  0.375, -0.5  , -0.375, -0.25 , -0.125])
И как теперь перейти к человеческим герцам?

helium
() автор топика

Первые N/2+1 точек FFT содержат положительные частоты от 0 до частоты Найквиста, остальные — отрицательные. Частота Найквиста — это половина частоты дискретизации. Зная её, ты оценишь шаг дискретного спектра.

d_a ★★★★★
()
Ответ на: комментарий от helium

И как теперь перейти к человеческим герцам?

умножить на частоту одного отсчета.

dikiy ★★☆☆☆
()

Начни с последовательностей, для которых ты знаешь, из каких частот они состоят ([1, 1, 1, 1], [1, -1, 1, -1] ...), и потихоньку разберёшься.

А так, похоже, что 0.5 это нулевая гармоника (константная составляющая), от неё антисимметрично идут аплитуды гармоник (в одну сторону для положительной, в другую для отрицательной частоты), начальный 0 смысла не несёт.

prischeyadro ★★★☆☆
()
Ответ на: комментарий от prischeyadro

А так, похоже, что 0.5 это нулевая гармоника (константная составляющая), от неё антисимметрично идут аплитуды гармоник (в одну сторону для положительной, в другую для отрицательной частоты), начальный 0 смысла не несёт.

Садись, два.

d_a ★★★★★
()

ты сначала теорию БПФ изучи. А начни не с «быстрого», а в «обычного» ФП. Его сначала реализуй, и тогда поймёшь, как сделать «быстрое», и почему юзают именно его.

emulek
()
Ответ на: комментарий от d_a

И что же это такое?

Речь не об обычном fft, обычный fft там выше приведён: 8.+0.j, 0.+0.j, 0.-4.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+4.j, 0.+0.j

Но, пожалуй, всё-таки ведущий ноль это не бессмысленный элемент, а коэффициент гармоники с частотой Найквиста.

prischeyadro ★★★☆☆
()
Последнее исправление: prischeyadro (всего исправлений: 3)
Ответ на: комментарий от prischeyadro

И что же это такое?

Вектор нормированных частот от минус частоты Найквиста (-0.5) до плюс частоты Найквиста (+0.5). Положительная и отрицательная половины переставлены местами для симметрии с выхлопом FFT.

d_a ★★★★★
()
Ответ на: комментарий от prischeyadro

Но, пожалуй, всё-таки ведущий ноль это не бессмысленный элемент, а коэффициент гармоники с частотой Найквиста.

хоспади.. Ведущий ноль - это значит, что частота 0.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

хоспади.. Ведущий ноль - это значит, что частота 0.

Только не говори мне, что в последовательности [1, 2, 1, 0, 1, 2, 1, 0] нулевая гармоника равна нулю.

prischeyadro ★★★☆☆
()

Блин. Понапринаплетали тут каких-то Найквистов. Зачем?

ДПФ - это же просто сумма

[latex]f_j=\sum_{k=0}^{N-1} c_k \exp(-2\pi i \frac {jk}N)[/latex]

где [latex]f_j[/latex] - это собсно функция, на которую ДПФ был натравлен, а [latex]c_n[/latex] - это вычисленные коеффициенты ДПФ.

Взглянув на то, что внутри экспоненты стоит можно увидеть, что частота равна аккурат [latex]\frac{jk}N[/latex]. То есть, если у тебя всего 100 отсчетов по одной секунде, то, к примеру второй элемент в массиве соответствует индексу k=1 => имеет частоту 1/100 секунд.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 2)
Ответ на: комментарий от helium

И как теперь перейти к человеческим герцам?

The returned float array f contains the frequency bin centers in cycles per unit of the sample spacing (with zero at the start). For instance, if the sample spacing is in seconds, then the frequency unit is cycles/second.

Возвращаемый массив чисел с плавающей точкой f содержит середины диапазонов частот (с нулём в начале) в единицах циклов (т.е. изменений фазы на 2*pi) на единицы шага отсчётов d. Если исходные отчёты снимались с шагом в секундах, тогда единицы частоты это циклы/секунды.

dn2010 ★★★★★
()
Ответ на: комментарий от prischeyadro

Только не говори мне, что в последовательности [1, 2, 1, 0, 1, 2, 1, 0] нулевая гармоника равна нулю.

ведущий ноль - это среднее значение функции. Можешь считать, часть спектра с частотой ноль.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Блин. Понапринаплетали тут каких-то Найквистов. Зачем?

Затем, что речь об оцифрованном сигнале и физической интерпретации его спектра.

d_a ★★★★★
()
Ответ на: комментарий от d_a

Блин. Понапринаплетали тут каких-то Найквистов. Зачем?

Затем, что речь об оцифрованном сигнале и физической интерпретации его спектра.

но зачем усложнять? Все отлично без всяких Найксимтов интерпретируется. Достаточно взглянуть на формулу.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

У вас идёт бессмысленный спор физика с математиком. Если у исходных отсчётов есть физический шаг, то у результатов будут физические круговые частоты, плюс из-за особенности FFT они выстроены достаточно своеобразным образом.

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

У вас идёт бессмысленный спор физика с математиком. Если у исходных отсчётов есть физический шаг, то у результатов будут физические круговые частоты,

круговые частоты настолько же физические, насколько и математические. Я же написал уже все. я уже написал, что просто умножением ты получишь реальную частоту. Причем тут физика?

плюс из-за особенности FFT они выстроены достаточно своеобразным образом.

ЛОЛШТО?

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

ведущий ноль - это среднее значение функции

А теперь ещё раз внимательно посмотри последовательность: [1, 2, 1, 0, 1, 2, 1, 0] Где тут ноль в среднем значении?

prischeyadro ★★★☆☆
()
Ответ на: комментарий от prischeyadro

А теперь ещё раз внимательно посмотри последовательность: [1, 2, 1, 0, 1, 2, 1, 0] Где тут ноль в среднем значении?

ты походу не понял о чем речь:

 np.fft.fftfreq(8)
array([ 0.   ,  0.125,  0.25 ,  0.375, -0.5  , -0.375, -0.25 , -0.125])[br]

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 2)
Ответ на: комментарий от dikiy

ЛОЛШТО?

Вот такой порядок частот, который даёт FFT:

np.fft.fftfreq(8)

array([ 0. , 0.125, 0.25 , 0.375, -0.5 , -0.375, -0.25 , -0.125])

несколько отличается от [-pi/2 .. pi/2) с определённым шагом.

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

Вот такой порядок частот, который даёт FFT:

np.fft.fftfreq(8)

array([ 0. , 0.125, 0.25 , 0.375, -0.5 , -0.375, -0.25 , -0.125])

несколько отличается от [-pi/2 .. pi/2) с определённым шагом.

совершенно то же самое. Просто данная функция возвращает обычные частоты, а не круговые.

dikiy ★★☆☆☆
()
Ответ на: комментарий от prischeyadro

Ты вообще читаешь то, что тебе пишут? Ведущий ноль в том массиве - это САМА нормированная частота 0, это не амлитуда гармоники с частотой 0. "Нормированная" означает, что её разделили на частоту дискретизации. Значение 0,5 - это половина частоты дискретизации, т.е. ч-та Найквиста, -0,5 - то же, но в отрицательной половине спектра. И все промежуточные значения дискретных частот.

d_a ★★★★★
()
Последнее исправление: d_a (всего исправлений: 1)

и кстати, юзай rfft. В твоем случае это лучше будет.

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.