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

 
 
> Определение периода сигнала, нужен простой алгоритм
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

Сообщений в этой теме
- 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
|- - jer   Цитата(Taradov Alexander @ Aug 24 2010, 22...   May 11 2011, 12:34
- - 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 Текстовая версия Сейчас: 23rd July 2025 - 03:33
Рейтинг@Mail.ru


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