|
Определение периода сигнала, нужен простой алгоритм |
|
|
|
 |
Ответов
|
Aug 24 2010, 18:39
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
И так, приемлемое решение нашлось. Алгоритм: 1. Входной сигнал разбиваем на блоки длинной в несколько раз большей чем длинна самого длинного периода (я взял 5). 2. Считается автокорреляция блока. 3. Ищется первый максимум (кроме центрального). Расстояние этого максимума от центрального - искомый период. 4. Можно еще дополнительные меры предпринять, напрмер иногда второй максимум получается немного больше первого, такие вещи можно отфильтровать пытась сначала искать максимум там, где он ожидается (ранее вычисленный период), а только потом глобально. Можно делать перекрывающиеся блоки, и т.д. Вот код на матлабе и результат его работы. CODE clear all
Fd = 44100;
data = wavread('~/guitar2.wav');
s = data'; l = 535 * 5; % Fd / 82 Hz = 535 (e string frequency). zz(length(s)) = 0; for i = 1:l:length(s)-l, tt = xcorr(s(i:i+l)); [~, i1] = max(tt); % always at l/2 for j = i1:length(tt), if tt(j+1) > tt(j), i2 = j; break; end; % Find first local minimum end [~, i3] = max(tt(i2:length(tt)));
zzv = (i2+i3)-i1; for j = i:i+l, zz(j) = zzv; end; end
figure; hold on; plot(s); plot(zz / 2000, 'r');
Сообщение отредактировал Taradov Alexander - Aug 24 2010, 18:42
Эскизы прикрепленных изображений
|
|
|
|
|
May 11 2011, 12:34
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-05-09
Пользователь №: 49 456

|
Цитата(Taradov Alexander @ Aug 24 2010, 22:39)  И так, приемлемое решение нашлось. Алгоритм: 1. Входной сигнал разбиваем на блоки длинной в несколько раз большей чем длинна самого длинного периода (я взял 5). 2. Считается автокорреляция блока. 3. Ищется первый максимум (кроме центрального). Расстояние этого максимума от центрального - искомый период. 4. Можно еще дополнительные меры предпринять, напрмер иногда второй максимум получается немного больше первого, такие вещи можно отфильтровать пытась сначала искать максимум там, где он ожидается (ранее вычисленный период), а только потом глобально. Можно делать перекрывающиеся блоки, и т.д. Вот код на матлабе и результат его работы. Код clear all
Fd = 44100;
data = wavread('~/guitar2.wav');
s = data'; l = 535 * 5; % Fd / 82 Hz = 535 (e string frequency). zz(length(s)) = 0; for i = 1:l:length(s)-l, tt = xcorr(s(i:i+l)); [~, i1] = max(tt); % always at l/2 for j = i1:length(tt), if tt(j+1) > tt(j), i2 = j; break; end; % Find first local minimum end [~, i3] = max(tt(i2:length(tt)));
zzv = (i2+i3)-i1; for j = i:i+l, zz(j) = zzv; end; end
figure; hold on; plot(s); plot(zz / 2000, 'r'); Александр, у Вас получилось это в железе? Очень интересно, поскольку я сам делал то же самое в матлабе, еще года два назад промоделировал, в матлабе тогда результат меня устроил, период между максимумами функции автокорреляции тестового сигнала находил, усреднял еще, вычислялась частота с точностью чуть ли не десятки герца. А вот в атмеловском 8-ми разрядном контроллере промоделировать не получилось, в Протеусе я пытался. На компе в матлабе это удобнее, там и частоту любую задаешь и считает он с плавающей точкой. Вобщем интересно, что не я один догадался до такого способа )). Теперь бы результат в железе получить бы. Оставил эту затею в свое время, но мысль интересная, потому хотелось бы узнать как ее развивают другие.
|
|
|
|
Сообщений в этой теме
Taradov Alexander Определение периода сигнала Aug 23 2010, 13:01 scifi Что-то мне подсказывает, что здесь без "сложн... Aug 23 2010, 14:00 Taradov Alexander QUOTE (scifi @ Aug 23 2010, 18:00) И ещё ... Aug 23 2010, 14:10 Microwatt Цитата(Taradov Alexander @ Aug 23 2010, 16... Aug 23 2010, 14:16 Taradov Alexander QUOTE (Microwatt @ Aug 23 2010, 18:16) Ст... Aug 23 2010, 14:47  Oldring Цитата(Taradov Alexander @ Aug 23 2010, 18... Aug 23 2010, 15:17   Taradov Alexander QUOTE (Oldring @ Aug 23 2010, 19:17) У ва... Aug 23 2010, 15:27    Andrey_1 Цитата(Taradov Alexander @ Aug 23 2010, 19... Apr 2 2011, 19:10 Oldring Цитата(Taradov Alexander @ Aug 23 2010, 17... Aug 23 2010, 14:31 Alex11 Вы бы поиграли с модельками, тем более, что у Вас ... Aug 23 2010, 15:28 Taradov Alexander QUOTE (Alex11 @ Aug 23 2010, 19:28) Вы бы... Aug 23 2010, 15:51  Microwatt Цитата(Taradov Alexander @ Aug 23 2010, 18... Aug 23 2010, 16:06   Taradov Alexander QUOTE (Microwatt @ Aug 23 2010, 20:06) Во... Aug 23 2010, 16:18 @Ark Судя по Вашему описанию и картинкам, главное отлич... Aug 23 2010, 17:42 rezident Может я чего-то не понял, но почему из всего спект... Aug 23 2010, 17:51 Taradov Alexander QUOTE (rezident @ Aug 23 2010, 21:51) Мож... Aug 23 2010, 18:29  demiurg_spb Я для настройки гитары пользуюсь вот этой софтинко... Aug 23 2010, 19:14   Taradov Alexander QUOTE (demiurg_spb @ Aug 23 2010, 23:14) ... Aug 23 2010, 19:21    demiurg_spb Цитата(Taradov Alexander @ Aug 23 2010, 23... Aug 23 2010, 19:36    Самурай Alexander, попробуйте посмотреть в сторону алгорит... Aug 23 2010, 19:57 Microwatt Ага, теперь из картинки "ОК" и "Пло... Aug 23 2010, 19:08 GetSmart Автокореляцию не пробовали? Вроде идеальная для эт... Aug 23 2010, 23:04 Wise ЦитатаВ идеале нужен алгоритм, который найдет подо... Aug 23 2010, 23:22 fontp Здесь много всего муыкального, в том числе и опред... Aug 24 2010, 09:59 Dmitry Valento Александр, но ведь ваш алгоритм не дает высокой то... Mar 31 2011, 08:05 Alexey Lukin Улучшить точность можно с помощью параболической и... Apr 7 2011, 09:15 Make_Pic Цитата(Alexey Lukin @ Apr 7 2011, 12:15) ... Apr 18 2011, 09:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|