powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Анализ звука алгоритмом FFT
18 сообщений из 43, страница 2 из 2
Анализ звука алгоритмом FFT
    #37734976
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть программа, Praat, http://www.fon.hum.uva.nl/praat/
мне бы хотелось сделать что-то подобное, но для андроид

суть программы Praat, записывать голос и показывать его параметры.
я хочу сделать тоже самое, только параметры сохранять в БД

самое главное что у них все получилось, ну в плане анализа голоса,
значит задача решаема, осталось только понять как они это сделали....и вот тут у меня пробел в знаниях, потому что раньше со звуком я никогда не работал :(
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735035
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты ж написал

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

взять характеристики голоса можно. Тот же спектр построить или среднюю громкость получить. Вопрос в том что с ними дальше делать.

Элементарно сказать "черничный пирог" можно как "чирничый пирок" или "черничный пирох".

Если ты считаешь что коллектив по твоей ссылке этот вопрос решил - напиши им письмо и спроси.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735170
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
делать оприделять эмоцию на основе характеристик голоса это вторая часть проекта до которой еще нужно дожить.

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

private float[] spectrumAnalyz(float[] spectr) {
float Re;
float Im;
float[] spectruData = spectr;
float[] mySpectrum = new float[(spectruData.length / 2) - 1];
for (int i = 1, j = 0; i < spectruData.length / 2; i++, j++) {
Re = spectruData[2 * i];
Im = spectruData[2 * i + 1];
mySpectrum[j] = (float) Math.sqrt(Re * Re + Im * Im);
}
return mySpectrum;
}

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

в итоге у меня есть float массив с частотами записи моего голоса. дальше я, используя гугл, нахожу формулу pitch 69+12*log2(F/440), где F - частота в Hz.

теперь у меня есть массив float который содержит информацию о pitch моего голоса. ну и дальше я нахожу мин, макс. среднее и среднее квадратичное.

задача с помощью android device отобразить характеристики голоса человека. то что я буду дальше делать с ними, это уже второй шаг. сейчас мне интересно правильно ли я понял и реализовал задачу ?
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735231
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnosкак я понимаю, FFT раскладывает звуковую волну на гармоники. точнее на сумму гармоник. после применения формулы представленной выше, я получаю просто набор частот. (не понимаю зачем надо было сначла раскладывать на гармоники, а потом опять возвращать в частоты, может есть способ сразу в частоты? )


Вы получаете спектр сигнала: значения амплитуд разных гармоник. Для данного окна (8000 отсчетов) набор частот этих гармоник фиксирован.

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

1. Вычислил среднее значение сигнала.
2. Из всех отсчетов вычел это среднее.
3. Нашел точки (времена) t[i], где сигнал меняет знак
4. Принял, что на отрезке t[i]..t[i+1] частота F[i]=8000/(t[i+1]-t[i])
5. Далее вычислял все про высоту сигнала по формуле с log2, искал мин, макс и пр.

И почитайте про ряд Фурье (не FFT, а именно ряды).
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735248
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. Принял, что на отрезке t[i]..t[i+1] частота F[i]=8000/(t[i+1]-t[i])

Поправка:
F[i]=4000/(t[i+1]-t[i])
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735461
Реалист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без теории любые математические преобразования не стоят выеденного яйца. Это все равно, что пытаться предсказать курс доллара на основе его предыдущих значений. В принципе можно в некоторых случаях получить псевдодостоверный результат, но вот только к "предсказанию" это не будет иметь не малейшего отношения.
Так же и при анализе звука. Можно пытаться измерять множество различных характеристик, но пока не будет хоть какой то модели звукообразования и принципов влияния эмоций на эту модель, то вычислять БПФ можно до бесконечности с практически нулевым результатом.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37735523
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnosна данный момент я получаю массив байтов с микрофона. Каждую секунду записи я получаю 8000 байт.
но я не знаю, что мне с ними делать. гугл все время выдает ссылки на FFT.
порывшись в различных проектах которые использовали FFT, я нашел эту формулу

private float[] spectrumAnalyz(float[] spectr) {
float Re;
float Im;
float[] spectruData = spectr;
float[] mySpectrum = new float[(spectruData.length / 2) - 1];
for (int i = 1, j = 0; i < spectruData.length / 2; i++, j++) {
Re = spectruData[2 * i];
Im = spectruData[2 * i + 1];
mySpectrum[j] = (float) Math.sqrt(Re * Re + Im * Im);
}
return mySpectrum;
}

я не знаю насколько она правильна, потому что достоверной информации так и не нашел, но в различных проектах используют именно ее.


это абсолютно правильный кусок. Но не бпф. Ты о нём уже спрашивал. Я тебе уже по нему ответил - это преобразование массива комплексных чисел в массив обычных. Это не вычисление бпф.

Ты написал что используешь JTransform. Там уже есть реализация дискретного преобразованиея фурье в пакете edu.emory.mathcs.jtransforms.fft. В исходниках его можешь посмотреть алгоритм если он тебе зачем-то понадобится. Ничего писать не надо, реализация в этой библиотеке уже есть (не знаю уж насколько этим можно пользоваться но есть). Надо понять зачем оно тебе.

Ты спрашиваешь по второму разу.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37736748
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1024,

я знаю что это не вычисление БПФ. вычисление БПФ я сделал до этой функции.

Код: java
1.
2.
FloatFFT_1D fft = new FloatFFT_1D(dataSize);
fft.realForward(data);



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

Реалист,

Полностью согласен, без теории далеко не уйдешь. Если можно, посоветуйте книги или сайты с теорией анализа звука и/или голоса.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37736810
Реалист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnos,

Хотя бы вот это для начала.
На самом деле, нет однозначной теории и математического аппарата, который позволил бы моделировать, а значит и распознавать, человеческую речь с достаточной точностью.
Существуют несколько областей, в которых подход к анализу может значительно отличаться, например командное распознавание фиксированного набора слов и распознавание слитной речи.
В вашем случае, т.е. анализ эмоций, нужна предварительная работа по выявлению самих значимых характеристик голоса. То есть нужно искать или создавать самому базу данных разных дикторов с произношением фраз в различном эмоциональном состоянии. На основании этих данных пытаться выявить значимые признаки (скорее всего анализ частоты будет одной, но не единственно и не самой главной анализируемой характеристикой голоса).

Это я к чему? Не нужно надеяться на быстрый и 100% результат.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37736821
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnos1024,

я знаю что это не вычисление БПФ. вычисление БПФ я сделал до этой функции.

Код: java
1.
2.
FloatFFT_1D fft = new FloatFFT_1D(dataSize);
fft.realForward(data);



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



Из БПФ Вы не получите pitch.
Вы понимаете, что именно Вам возвращает БПФ (кроме того, что это массив каких-то чисел)?
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37737052
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Если я правильно понял, то это гармоники.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37737171
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnosx1ca4064,

Если я правильно понял, то это гармоники.

Попробую переформулировать вопрос:

Что содержится в spectr[0] и spectr[1]?
Что такое sqrt(sqrq(spectr[0])+sqr(spectr[1]))?
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37743435
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Данный вариант алгоритма преобразования Фурье использует для вычисления комплексные числа, что дает ощутимый прирост производительности. Такой алгоритм возвращает массив у которых i-й элемент это реальная часть, а i+1 это мнимая часть. Чтобы переобразовать комплексное число в один из типов данных поддерживаемый java нужно возвести в квардарт реальную и мнимую часть, сложить полученные числа, и потом под корень. В итоге получается тип данные поддерживаемый java над которым можно производить вычисления.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37743589
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
etnosx1ca4064,

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


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

Такой алгоритм возвращает массив у которых i-й элемент это реальная часть, а i+1 это мнимая часть. Чтобы переобразовать комплексное число в один из типов данных поддерживаемый java нужно возвести в квардарт реальную и мнимую часть, сложить полученные числа, и потом под корень. В итоге получается тип данные поддерживаемый java над которым можно производить вычисления.

Я хорошо понимаю, что делает показанный алгоритм.

А вот Вы понимаете, что преобразование (комплексное число)->(реальное число) невозможно без потери информации?
И это никак не связано с типами данных, которое поддерживает ява или другой язык?

Вопросы, которые я задал в предыдущем посте остаются в силе.
Странно, но у меня сложилось впечатление, что Вы пытаетесь меня в чем-то убедить. Это не тот спор: я примерно представляю, как получить те критерии, которые Вам необходимы, а Вы, похоже, не совсем.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37745548
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064,

spectr[0] spectr[1] это "амплитуда" синуса и косинуса (или наоборот)
sqrt(sqrq(spectr[0])+sqr(spectr[1])) это мощность гармоники
т.е. грубо говоря ПФ поясняет вам с какими коэффициентами сложить синусы и косинусы кратных гармоник чтобы получить сигнал, похожий на исходный.

а ява не поддерживает вычисления с комплексными числами это вообще pusque.

кстати, фурье даёт точность частот ближе к верхнему краю, полоса частот в которых хранится смысловая нагрузка человеческой речи, при окне бпф 1024-2048 отсчетов, будет занимать 2-3 нижних гармоники, из которых вы ничего не поймете. Чтобы выявить pitch вам нужно либо очень высокое разрешение сигнала, либо автокорреляционный анализ, который достаточно ресурсоемок, хотя даёт точные результаты именно по тональности.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37746018
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагман,


Отверчайте ТС, пожалуйста. У меня этих вопросов нет.
Чтобы выявить pitch вам нужно либо очень высокое разрешение сигнала, либо автокорреляционный анализ, который достаточно ресурсоемок, хотя даёт точные результаты именно по тональности.


А что вы думаете насчет предложенного мной алгоритма (анализа 0 сигнала во временном домене)?

Как я понял, pitch это попытка представить сигнал в виде частота(время). Фурье данную задачу не решает. Т.о. либо примитивный анализ 0 сигнала, или (тут есть ньюансы) - вейвлеты.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37749249
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x1ca4064,

да, перепутал, извините.
0 сигнал подойдет для простого сигнала типа гладкой синусоиды, можно сначала попробовать отфильтровать сигнал чтоб удалить лишнее.
...
Рейтинг: 0 / 0
Анализ звука алгоритмом FFT
    #37750138
etnos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Не подумайте ничего такого, я никого не пытался убедить, просто рассказывал как я понимаю этот алгоритм.
Вы абослютно правы, я не доконца понимаю суть работы этого алгоритма (не факт что я вообще его правильно понимаю :( )


Лагман,

Лагманкстати, фурье даёт точность частот ближе к верхнему краю, полоса частот в которых хранится смысловая нагрузка человеческой речи, при окне бпф 1024-2048 отсчетов, будет занимать 2-3 нижних гармоники, из которых вы ничего не поймете. Чтобы выявить pitch вам нужно либо очень высокое разрешение сигнала, либо автокорреляционный анализ, который достаточно ресурсоемок, хотя даёт точные результаты именно по тональности.

А как я могу получить полосу частот в которой хранится смысловая нагрузка человеческой речи другим способом ? Может я придумываю велосипед и все давно уже реализовано?
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Анализ звука алгоритмом FFT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]