Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить точную частоту звукового сигнала, какой алгоритм лучше использовать ? 
:(
    Опции темы
Santik
Дата 17.3.2012, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Мне кажется FFT можно для синусов и косинусов можно по простой формуле посчитать.
Вот я для 7 гармоник прикинул (в файле).
Я не понял, причем сдесь Ng=1???
FFT вне этого цикла !
Если FFT  не делать - в цикле останется умножение 2-х векторов и реверсное FFT .



Добавлено @ 10:48
Файл

Это сообщение отредактировал(а) Santik - 17.3.2012, 10:52

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  1007_1.xlsx 838,35 Kb
PM MAIL   Вверх
Kpeved
Дата 17.3.2012, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Дыра в быстродействии не в ФФТ а в синусах и косинусах  . При нахождении 1го пика мы мы M-раз , в зависимости от точности , проходим по всему массиву длинной N и каждый раз считаем син и кос . Потом ещё берём корень...
По быстродействию должен получится как ФФТ , но получается намного медленнее .

Может можно применить формулу эйлера или ещё что то ?
PM MAIL   Вверх
Santik
Дата 17.3.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Неее... Ты не прав!  Просто каждый раз приходится вычислять "длинный" интеграл внутри которого умножения на син/кос.
А то что М-проходов - сделай итерационную процедуру поиска экстремума. У меня до 0.001 за 5-6 итераций сходилось...  А так "тупо" никто не делает. Pavia  это же для примера написал...

Добавлено через 13 минут и 24 секунды
И мне кажется надо попробывать как vedun предлагал, но только использовать все гармоники. Только полученные не забывай поделить на номер. И среднюю взять. Наверное точности хватит.
PM MAIL   Вверх
vedun
Дата 17.3.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(Santik @ 17.3.2012,  11:11)
 И мне кажется надо попробывать как vedun предлагал, но только использовать все гармоники...
 А как вы собираетесь использовать все гармоники?
PM ICQ Skype Jabber   Вверх
Santik
Дата 17.3.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Ну первую мы вычислили... А дальше "тупо" умножаем на 2 , 3, .... 11 . И методом параболы уточняем.
Чем выше гармоника, тем точнее расчёт...

Это сообщение отредактировал(а) Santik - 17.3.2012, 12:02
PM MAIL   Вверх
vedun
Дата 17.3.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(Santik @ 17.3.2012,  12:00)
Ну первую мы вычислили... А дальше "тупо" умножаем на 2 , 3, .... 11 . И методом параболы уточняем.
Чем выше гармоника, тем точнее расчёт...
 Но ведь эти гармоники в общем случае не кратны друг другу. Как вы собираетесь это учесть ?
PM ICQ Skype Jabber   Вверх
Pavia
Дата 17.3.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Santik
Вы считаете через FFT свёртку. Для sin и cos свёртку линейная.
Цитата

Мне кажется FFT можно для синусов и косинусов можно по простой формуле посчитать.

Не кажется так и есть. Вот корреляцию для вашего случая можно считать со сложностью N*Ng.
Но это не даёт преимуществ. Надо выносить FFT из цикла по k.


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

А вот свёртку можно ускорить в виду того что у меня используется FT где sin и cos вычисляется на каждом шагу.
Есть алгоритм Герцеля. В виду того что он плохо описан в литературе, дальнейшее что я опишу  может отличаться или не соответствовать.
Так вот для быстрого расчёта можно использовать свойство косинус суммы и синус суммы. 


Код

function FT(w:Real; N:Integer; a:PAReal):Complex;Overload;
var i:Integer;
N1:Real;
begin
Result.Re:=0;
Result.Im:=0;
N1:=1/N;
for i:=0 to N-1 do
 begin
 Result.Re:=Result.Re+A[i]*Cos(-2*Pi*i*w*N1);
 Result.Im:=Result.Im+A[i]*Sin(-2*Pi*i*w*N1);
 end;
Result.Re:=Result.Re*N1;
Result.Im:=Result.Im*N1;
end;

Здесь Cos(-2*Pi*i*w*N1); можно представить в виде cos(-2*Pi*(i-1)*N1+-2*Pi*1*N1)=переобозначим=cos(a_I_1+b)=cos(a_I_1)*cos(b)-sin(a_I_1)*sin(b)
sin(a_I_1+b)=sin(a_I_1)*cos(b)+cos(a_I_1)*sin(b)

1)sin(b)
cos(b) 
Вычисляются вне цикла.
2)
sin(a_I_1)
cos(a_I_1)
Известно с предыдущей итерации цикла. Раз в 10 должно ускориться.

Добавлено через 12 минут и 34 секунды
А вообще всё это ерунда, берём FFT и немного переделываем поделив  начальную частоту в N раз.
Тем самым мы повысим точность и скорость.
PM MAIL   Вверх
Santik
Дата 17.3.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Цитата(vedun @ 17.3.2012,  14:05)
 Но ведь эти гармоники в общем случае не кратны друг другу. Как вы собираетесь это учесть ?

А почему не кратны? Это же колебания струны. Обязаны быть кратными!
Я проверял. Правда если вы не на 44100 Гц  смотрели , то возможно, что пролезают гармоники с частотами больше Найквиста, которые благополучно в низкочастотную отражаются...

Это сообщение отредактировал(а) Santik - 17.3.2012, 15:55
PM MAIL   Вверх
Santik
Дата 17.3.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Цитата(Pavia @ 17.3.2012,  14:45)
Не кажется так и есть. Вот корреляцию для вашего случая можно считать со сложностью N*Ng.
Но это не даёт преимуществ. Надо выносить FFT из цикла по k.

Так вот я  и хочу одно FFT из цикла убрать. Останется в цикле перемножение векторов и обратное FFT.
Тоже конечно не очень...
Так где мне посмотреть это "так и есть"??? У меня вылезает что-то типа SIN(X)/X.
Велосипед изобретать не хочется.
PM MAIL   Вверх
vedun
Дата 17.3.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 23.12.2010

Репутация: 2
Всего: 2



Цитата(Santik @ 17.3.2012,  15:10)
 А почему не кратны? Это же колебания струны...
Струна ведь не идеальна, там наверняка присутствует модовая дисперсия. Другой вопрос насколько она сильна, возможно её и не заметно для вашей точностей измерений. Вот похожая тема, но там обсуждали фортепиано. Там на второй странице есть картинки с формулами, полюбопытствуйте.
PM ICQ Skype Jabber   Вверх
Santik
Дата 17.3.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Исходя из задачи  smile.  Не думаю, что при таком уровне измерений мы дисперсию увидим.  Надо считать.

vedun,  докладываю: Дисперсии не обнаружено!

Код

1                     328               -0.0445
2    656.1        328.05           0.0055
3    983.7        327.9            -0.1445
4    1312.05    328.013         -0.032
5    1640.15    328.03          -0.0145
6    1968.65    328.108         0.063833333
7    2295.65    327.95           -0.0945
8    2624.55    328.069         0.02425
9    2952.25    328.028        -0.016722222
10    3282.6    328.26            0.2155
11    3608.91    328.08          0.037327273


А если и есть, то совсем маленькая и почти совсем незаметная... smile 

Это сообщение отредактировал(а) Santik - 17.3.2012, 17:53
PM MAIL   Вверх
Santik
Дата 17.3.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Цитата(Pavia @ 17.3.2012,  14:45)
Я интерационно не считал, так как с полосой был не уверен. Сейчас уверен, да можно интерационо.

Я что-то пропустил, наверное! Новые методы появились??? smile 
PM MAIL   Вверх
Kpeved
Дата 18.3.2012, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Pavia, а можно поподробнее как именно нужно переделать ? И зачем нам частоту делить ?
PM MAIL   Вверх
Santik
Дата 19.3.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.3.2012
Где: Мирный (Якутия)

Репутация: нет
Всего: нет



Цитата(Kpeved @ 18.3.2012,  00:52)
Pavia, а можно поподробнее как именно нужно переделать ? И зачем нам частоту делить ?

Pavia похоже погорячился...
Я вот испытал модифицированный метод Vedunа.
Через 3 точки Х(f0),Х(f1),Х(f2) (из FFT,  при f1- макс. значение) проводим параболу. Находим f3.
Далее модификация - считаем наш интеграл и находим Х(f3)
Ещё раз считаем интеграл Х(f3 +- h)      (+ или минус в зависимости от значений Х(f1) и Х(f3).
Через 3 точки снова проводим параболу. Находим искомую частоту.
Ошибка менене 0.1 Гц  на частоте 380 Гц. (Fd=44100)
Таким образом "длинный" интеграл считаем всего 2 раза!
Можно, конечно, еще раз эту процедуру повторить, чтобы получить ещё меньшую погрешность.


Это сообщение отредактировал(а) Santik - 19.3.2012, 21:56
PM MAIL   Вверх
Kpeved
Дата 19.3.2012, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.2.2012

Репутация: нет
Всего: нет



Santik, а на чем проверяли ? На генераторе или реальном звуке ?  Мне кажется что там вообще не парабола - фронт и спады разные и она там никак не получится . 
И у вас как я понял 3 раза интеграл считается - для X(f3) , X(f3-h) , X(f3+h)  - потом находится методом параболы ? Т.есть мы просто считаем значения амплитуды в этих точках и строим параболу ? Не совсем точный метод  . Тем более если учесть искажённые сигналы с перегрузом или дисторшном или с чем нибудь ещё то там будет точно не парабола . 
Я все ещё надеюсь что  Pavia что нибудь напишет по поводу переделки алгоритма )  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0898 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.