Поиск:

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


Опытный
**


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

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



vedun
Я под ПФ- имел ввиду Преобразование Фурье, те расчёт коэффициента Фурье для заданной частоты. 
По сути это корреляция сигнала с sin и cos заданной частоты.
С полосой не скажу, толи 1 Гц толи стремится к нулю.


Это сообщение отредактировал(а) Pavia - 3.3.2012, 13:25
PM MAIL   Вверх
vedun
Дата 3.3.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pavia @ 3.3.2012,  13:15)
vedun
Я под ПФ- имел ввиду Преобразование Фурье, те расчёт коэффициента Фурье для заданной частоты. 
По сути это корреляция сигнала с sin и cos заданной частоты.
С полосой не скажу, толи 1 Гц толи стремится к нулю.
Ясно, тогда это будет фильтр с импульсной характеристикой sin и cos. Интересно что скажет автор темы по поводу результатов.
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 3.3.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот такие ноты должны получится при идеальной настройке .
1) ми - 329,6 Гц
2) си - 246,9 Гц
3) соль - 196 Гц
4) ре - 146,8 Гц
5) ля - 110 Гц
6) ми - 82,4 Гц
У меня же не строили - 6ая вниз , 2ая вверх . У вас получается что расхождение стабильно около 1 гц . Если на высоких это ещё приемлемо , то на низких не очень  . Частоты  vedun мне больше нравятся .  Но 8192 - это очень много  Это только целая секунда чтобы снять значения . Не пострадает ли точность если мы снимем 2048 и забьём все до 8к нулями ?
Вы кстати использовали оконные ф-ии хэмминга , блекмэна ?
PM MAIL   Вверх
Pavia
Дата 3.3.2012, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kpeved
Частота в вашей гитаре не равномерная. Уменьшаешь размер буфера частота меняется, растёт. Или сдвигаешь буфер тоже меняется.

Это сообщение отредактировал(а) Pavia - 3.3.2012, 22:14
PM MAIL   Вверх
vedun
Дата 3.3.2012, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Kpeved @ 3.3.2012,  20:07)
 Но 8192 - это очень много  Это только целая секунда чтобы снять значения . Не пострадает ли точность если мы снимем 2048 и забьём все до 8к нулями?
 Для 2048 точек картина такая:
  •  329,04
  •  253,99
  •  199,07
  •  148,65
  •  112,68
  •  82,14
Добивать 0-ми не пробовал, попробуйте, раскажите что получилось smile . Я делал интерполяцию параболой. 
Вообще трудно сказать как померять частоту такого импульсного сигнала, возможно на переходных процессах происходят смещения частоты, а так как там установившегося режима нет, то и меряем мы не понятно что. 

Цитата(Kpeved @ 3.3.2012,  20:07)
Вы кстати использовали оконные ф-ии хэмминга , блекмэна ?
 Нет.

PM ICQ Skype Jabber   Вверх
Kpeved
Дата 4.3.2012, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vedun,  а можешь поподробнее сказать про интерполяцию эту ?  Может быть пример кода на каком нибудь с-образном языке )

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


Pavia, я сдесь раньше картинку из аудишна выкладывал . Впринципе хоршо видно что частота колебается +- , только она равномерная . Даже супер крутые педальки грешат тем сыграв 2 раза одну и ту же струну результаты будут немного отличаться . Я думаю надо брать что то среднее после нескольких замеров - тесть точность будет постепенно расти .


Можно кстати узнать как вы выделяли основную гармонику ? Когда я замерял гармоники скакали как бешеные и частота всегда получалась в 2 - в 3 потом снова в 2 - раза больше . Или вы опирались на возможный диапазон настройки? 
PM MAIL   Вверх
Pavia
Дата 4.3.2012, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kpeved
Где-то у меня был код, но что-то он не попался поэтому делал на глазок, указывая диапазон где искать максимум. 

А вообще раньше пользовался таким кодом.
В частотной области после БПФ. По памяти так отступаем 5 Гц (в вашем случае я бы пропустил 20Гц), так как там обычно большая горка.  Далее берём производную и ищем перепад знака с - на +. Первый перепад это и будет первая гармоника.  А да для надежности ещё перед производной применяю простое сглаживание фильтром [1 2 1].  и использую порог чтобы отсечь лишний шум.

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

А да перед БПФ надо удалять постоянную составляющую. У вас видимо галочка стоит и горки нет. 

Набрал код по новый. 
Код

function DetectFirstF(a:TArrayReal; t:Real; dwSamplesPerSec:DWord; f1:Real=20; f2:Real=22500):Real;
var
 i,N:Integer;
 aa,b:TArrayReal;
 z:TArrayComplex;
 r:Real;
 fd:Real;
begin
fd:=dwSamplesPerSec;
N:=Length(a);
aa:=Copy(a);
r:=Mean(aa);
sub(aa,r);        // Убираем постоянную составляющую.
CopyInRe(z,aa);
FFT(z,False);    // Получаем спектр частот
amp(b,z);
for i:=1 to Length(b)-2 do
 b[i]:=0.25*b[i-1]+0.5*b[i]+0.25*b[i+1]; // Убираем небольшие шумы могут влиять на знак 1 производной.
for i:=6 to Length(b) div 2 do
 begin
 if (b[i]>t) and (2*b[i]-b[i-1]-b[i+1]>0) then // проверяем порог и знак второй производной
   begin
   Result:=DetectF(aa,dwSamplesPerSec,i*(Fd/N)-5,i*(Fd/N)+5); // Уточняем частоту, код этой функции на предыдущей странице форума
   Exit;
   end;
 end;
end;
...
Пример вызова
MaxF:=DetectFirstF(a,5,dwSamplesPerSec);



Это сообщение отредактировал(а) Pavia - 4.3.2012, 22:25
PM MAIL   Вверх
vedun
Дата 4.3.2012, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Kpeved @ 4.3.2012,  19:24)
vedun,  а можешь поподробнее сказать про интерполяцию эту ?  Может быть пример кода на каком нибудь с-образном языке )
 Я просто находил координаты вершины параболы используя 3 точки. В этой статье это точка Xa. Ну а с кодом на языке C я думаю ты справишся сам, я это всё в матлабе проверял. Писать реализацию на С времени сейчас нет.
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 5.3.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за ответы  smile 

Pavia, а что ещё за постоянная составляющая  ?
И каким образом можно фильтр реализовать ?

Вообще не шарю в VB  но предположу что  на 21 вы проверяете значение на пик ,а потом передаете в DetectF временной массив и частоту +- 5 знач от пика ? Пока ещё не совсем понимаю что эта ф-я делает .. точнее совсем не понимаю ..


vedun, Да , вроде понял ). находим а, б , а потом по формуле . Ну а как найти этот пик ? как делал Pavia?


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

Как кстати оконные ф-ии блэкмена , хемминга могут влиять на интерполяцию ?
PM MAIL   Вверх
Pavia
Дата 5.3.2012, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kpeved
Убираем постоянную составляющую так.
r:=Mean(aa);  // вычисляю среднее
sub(aa,r);        // вычитаю по поэлементно.

Теорию особо не встречал это чисто из практики.

Это Delphi. 
Цитата

 что  на 21 вы проверяете значение на пик ,а потом передаете в DetectF временной массив и частоту +- 5 знач от пика ?

Да всё верно, пик проверяю через нахождение второй производной.

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


Шустрый
*


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

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



Цитата(Kpeved @ 5.3.2012,  01:08)
Ну а как найти этот пик ? как делал Pavia?
 Наверно по разному можно, попробуй ещё варинт задать порог, и найти где у тебя спектр первый раз его превышает. Вобщем пробуй всё а оставь что лучше будет работать smile
PM ICQ Skype Jabber   Вверх
Kpeved
Дата 6.3.2012, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Всего отсчетов -4096, ЧД 8000. Ни окна ни порги не использовал

1. 329.1 
2. 251
3. 196.3
4. 147.47
5. 110.37
6. 81.1

для 8192 ЧД 8000

1. 328.6
2. 251.46
3. 194.83
4. 146
5. 109.87
6. 80.57

для 16384 ЧД 8000

1. 328.37
2. 251.7
3. 194.56
4. 146.2
5. 109.6
6. 80.32

да , скорее всего частота скачет туда сюда .Думаю эта точность до десятых - сотых  нам ничего не скажет 

Ещё потом попробую через ещё одно преобразование фурье , если его пойму ..

Может быть кстати правильней на нормальном генераторе попробывать ..
PM MAIL   Вверх
Kpeved
Дата 6.3.2012, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Протестил с простеньким генератором . 

Вот сдесь вот записал как раньше с микрофона   http://dl.dropbox.com/u/29529555/8k%20gen.rar
Чд 8000
частоты были такие :
 90, 135, 200, 300, 400, и телефонный гудок , частота которого должна была быть 440гц  , но мне кажется меньше)

результаты :
2048 отсчетов:

91.88
134.82
201.2
302.76
400.4
427.75

4096: 

90.84
135.76
200.2
299.8
399.4
426.76

8192:

90.34
135.26
200.69
300.3
398.9
426.27

16384:

90.04
135.01
199.95
300.05
399.17
426.5


Было бы интересно посмотреть на результаты со вторым преобразованием с различным кол-вом отсчетов .)
PM MAIL   Вверх
Pavia
Дата 6.3.2012, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Использую Хэмминга. 2048
1) 90.08
2) 134.99
3) 200.01
4) 300.01
5) 399.01
6) 426.37

Использую Хэмминга. 4096
1) 90.00
2) 134.99
3) 200.15
4) 300.00
5) 399.01
6) 426.33

Использую Хэмминга. 8192
1) 89.93
2) 135.01
3) 200.01
4) 300.00
5) 399.00
6) 426.34

Без окна 2048
1) 90.12
2) 135.00
3) 200.01
4) 300.01  (вначале по пал на пик 175.5 увеличел порог)
5) 399.02
6) 426.35

Без окна 4096
1) 89.99
2) 134.99
3) 200.11
4) 300.00
5) 399.01
6) 426.34

PM MAIL   Вверх
Kpeved
Дата 6.3.2012, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Pavia, Спасибо большое . 
Очень интересные результаты )  Ваш алгоритм поточнее получается .С хеммингом так вообще  лучше не придумаешь . 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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