FFT(БПФ) как получить частоту звука?
От: crusher_c Беларусь  
Дата: 01.06.07 11:16
Оценка:
Есть у меня 2 типа данных,
1) обычная волна, сэмплы. Как из нее получить частоту звука?
2) волна преобразованная по FFT(БПФ), как из нее получить частоту звука?

А общая задача в том, чтобы знать какая нота играется в определенный момент, это я могу узнать зная частоту.
Исходные данные — сэмплы, а ля как в вавке по которым я могу нарисовать синусоиды, и данные по которым я могу нарисовать спектрограмму.
Хелп плиз
Дзякуй за ўвагу!
Re: FFT(БПФ) как получить частоту звука?
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.06.07 14:36
Оценка: +1
Дык в звуке не одна частота, а много. Их Вы после Фурье и имеете. Какие-то могут быть сильно больше других — это основные. А могут и не быть, как в случае с шумом.
Re[2]: FFT(БПФ) как получить частоту звука?
От: crusher_c Беларусь  
Дата: 01.06.07 14:50
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Дык в звуке не одна частота, а много. Их Вы после Фурье и имеете. Какие-то могут быть сильно больше других — это основные. А могут и не быть, как в случае с шумом.



Да, но меня интересует что на что делить и что на что умножать. мне нужно получить частоту основную, обрамляющие не интересуют.
Спасибо
Дзякуй за ўвагу!
Re[3]: FFT(БПФ) как получить частоту звука?
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.06.07 22:01
Оценка:
Ничего не делить, максимум по модулю искать. Индекс максимального коэффициента даст частоту (см. формулу для Фурье).
Re: FFT(БПФ) как получить частоту звука?
От: sz36 Россия  
Дата: 01.06.07 23:09
Оценка:
Здравствуйте, crusher_c, Вы писали:


_>А общая задача в том, чтобы знать какая нота играется в определенный момент, это я могу узнать зная частоту.

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

Примерно так (для каждой опорной частоты f):
SumSin=sum(Un*sin(2*pi*f*delta*n)); n=0...N-1
SumCos=sum(Un*cos(2*pi*f*delta*n)); n=0...N-1
Result=SumSin^2 + SumCos^2;

Еще можно использовать алгоритм Герцеля, на процессоре, у которого есть арифметика с плавающей точкой, он будет эффективнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.