2016-02-13 7 views
4

Я также задал этот here на форуме Sound Design, но вопрос тяжелый информатика/математика, так что, возможно, на самом деле принадлежат на этом форуме:Решение для амплитуды и частоты в WAV файлы

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

F (S) = A * sin (T * S)

Где s это текущая выборка, А амплитуда и T - период. Теперь уравнение для T (период):

Т = (2π * Гц)/(α * ω)

Где Гц является частота в Герцах, α является выборок в секунду, и ω представляет собой сумму каналов.

Теперь я знаю, что решить для амплитуды, я мог бы просто найти значение F (S), где

S = (π/2)/T

Потому что тогда значение функции синуса будет 1, а окончательное значение будет эквивалентно А. Проблема состоит в том, что для деления на Т я должен знать Герц (или Гц).

Есть ли способ, которым я могу прочитать WAV-файл, чтобы обнаружить Hertz из данных, предполагая, что файл содержит только одну волну.

+0

Метод 1 (плохой): прочитайте данные .wav, то есть поплавки, которые представляют звук во времени, а затем получите максимальное значение всех значений времени, чтобы обнаружить амплитуду, а затем проверьте последовательность повторной окклюзии (так же, как и возможно), чтобы найти частоту. Метод второй (лучше подходит, но с математической точки зрения): используйте преобразование дискретного фурье для преобразования вашего сигнала в область частоты. Синусоидальная волна формы «x (t) = A * sin (omega * t)» будет превращена в DFT в один импульс дирака, расположенный в точке * omega * и имеющий амплитуду 'A'. Этот метод более подходит, поскольку это проблема обработки сигналов. –

+0

@MaximilianGerhardt: На самом деле, если вы знаете _a priori_, что вход представляет собой синусоидальную волну, первый метод на самом деле более точен. Он может найти период времени с точностью до подвыборки. – MSalters

+0

Здесь есть ответ. Это не тривиально. https://math.stackexchange.com/questions/36725/how-to-fit-a-curve-to-a-sinusoidal-wave – duffymo

ответ

1

Просто, чтобы уточнить условия, нужная вам собственность частота, а единица частоты - Герц (раз в секунду). По соглашению, типичная нота A имеет частоту 440 Гц.

На самом деле у вас есть функция. Эта синусоидальная волна в действительности имеет форму F(s) = A * sin(2*pi*s/T + c) - вы не знаете, когда она началась, чтобы вы получили постоянную c. Кроме того, вам нужно разделить на Т, а не умножать.

Получение амплитуды на самом деле довольно легко. Эта синусоидальная волна имеет ряд пиков и долин. Найдите каждый пик (выше, чем у обоих соседей) и каждую долину (ниже), вычислите среднюю пиковую и среднюю долину, а амплитуда ДВАЖДЫ - разница между ними. Довольно легко. Период T можно оценить, посчитав среднее расстояние от пика до пика и от долины до долины.

Есть один бит, где вам нужно быть осторожным. Если есть небольшой шум, вы можете получить небольшую вмятину возле пика. Вместо 14 17 18 17 14 вы можете получить 14 17 16 17 14. Это 16 не долина. Как только у вас есть хорошая оценка реальных пиков и долин, выбросьте все искаженные пики.

+0

Предполагая, что мое уравнение для частоты правильное (и да по частоте я имею в виду тон/шаг измеренный в Hertz), а также сказать, что я довольно новичок в работе с аудиофайлами (по состоянию на сегодняшний день) и говорю, что пытаться изучить преобразование Фурье было не очень просто. Как бы вы написали окончательное уравнение для вычисления тона/высоты тона/частоты волны в герцах, зная, что единственными данными, которые у вас есть, является выход функции F (s) (и выборок в секунду и каналов)? –

+0

@NasKas: Я бы не написал «окончательное уравнение». Я бы использовал процедуру в своем ответе. – MSalters

0

Вопрос не в том, «какая частота?». Если ваша функция - это нечто иное, чем простая функция триггера, это будет комбинация частот, каждая со своей собственной амплитудой.

Правильный подход - обработка цифрового сигнала с использованием finite Fourier transform. У тебя много рытья.

Если вы хотите принять только одну функцию триггера, у вас есть всего 2 (амплитуда и частота) или 3 степени свободы (амплитуда, частота и фазовый угол) и N временных точек в файле. Это означает, что least squares fitting принимает функцию синуса или косинуса.

+0

Фактически, только сигнал повторения может быть описан преобразованием Фурье как комбинация частот. Что касается наименьших квадратов, ваша ссылка объясняет, почему она здесь не применима: 'sin (s/T)' примерно такой же нелинейный, как и он. – MSalters

+0

Преобразования Фурье более общие, чем это. Если я моделирую одну волновую форму за один период, ничего не повторится с точки зрения моей проблемы. Я могу моделировать одну дельта Дирака или квадратный импульс. Я знаю разницу между линейными и нелинейными наименьшими квадратами. Подгонка все еще может быть выполнена. Может быть неправильной ссылкой. – duffymo

+0

Если вы моделируете одну волновую форму за один период и принимаете преобразование Фурье над ** точно ** в этот период, вы уже знали, что период и FT будут немного бессмысленными. Если у вас есть одна волна (один период, умножение синусоидальной волны и квадратный импульс) и по-прежнему принимать FT от минус бесконечности до плюс бесконечности, вы получаете свертку этой синусоидальной волны (dirac) с 'sinc' от квадратный импульс. – MSalters