реклама на сайте
подробности

 
 
> Определение периода сигнала, нужен простой алгоритм
ataradov
сообщение Aug 23 2010, 13:01
Сообщение #1


Профессионал
*****

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



На картинке приведено несколько периодов колебания басовой струны гитары. Красным отмечен ожидаемый период. Необходимо определить частоту колебаний, но прямой подсчет дает в 2 раза завышенный результат, так как там полно гармоник, но на глаз период хоршо заметен. При этом амплитуда "внутреннего" колебания изменяется от полного пропадания, до равной и даже большей, чем "основного" колебания.

Нужен способ определить период, при этом сложные вычисления (типа FFT) не желательны, так как должно работать все на 8-бит микроконтроллере.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ataradov
сообщение Aug 24 2010, 18:39
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jer
сообщение May 11 2011, 12:34
Сообщение #3





Группа: Новичок
Сообщений: 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-ми разрядном контроллере промоделировать не получилось, в Протеусе я пытался. На компе в матлабе это удобнее, там и частоту любую задаешь и считает он с плавающей точкой.
Вобщем интересно, что не я один догадался до такого способа )). Теперь бы результат в железе получить бы. Оставил эту затею в свое время, но мысль интересная, потому хотелось бы узнать как ее развивают другие.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th September 2025 - 21:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.07776 секунд с 7
ELECTRONIX ©2004-2016