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

 
 
> Модифицированный алгоритм Герцеля
Lost_Viking
сообщение Jan 21 2016, 05:58
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Взялся за реализацию. Прочитал про алгоритм тут: dsplib
Написал такую реализацию:
Код
#define Fd 9000 //частота дискретизации
#define f1 600  //частота тона
#define f_search 600 //искомая алгоритмом частота
#define N 70 //размер массива
int main()
{
unsigned char ADC[350]; //Массив, эмулирующий поток из АЦП
unsigned char buff[N]; //Буфер, в который пишутся данные из АЦП
float I[2];
float Q[2];
float a;
float b;
float c = 2* M_PI *f1/Fd; //Заранее рассчитаем то, что не будет меняться
float module; //здесь будет лежать модуль комплексного числа
I[0]=0; I[1]=0; //инициализируем массивы
Q[0]=0; Q[1]=0;
for (int i =0; i<350; i++)
{
    ADC[i] = (unsigned char) 100*sin(c*i)+100; //заполняем "поток" АЦП синусом с амплитудой от 0 до 100

}

a=cos(2*M_PI*f_search/N); //рассчитываем к-ты
b=sin(2*M_PI*f_search/N);

for (int n=0; n<70; n++) //начальное заполнение буфера
{
    I[0]=I[1]; //Готовим предыдущее I
    Q[0]=Q[1];
    buff[n]=ADC[n]; // Просто заполняем буфер данными из АЦП
    I[1]=a*(I[0]+buff[n])-b*Q[0]; //Все по формуле 16 из статьи
    Q[1]=a*Q[0]+b*(I[0]+buff[n]);

}
for (int n=70; n<350; n++) //Когда буфер заполнился, то запускаем цикл с выталкиванием
{
    I[0]=I[1];
    Q[0]=Q[1];
    I[1]=a*(I[0]+ADC[n]-buff[0])-b*Q[0]; //В качестве i(n) выступает ADC(n), где n=70. Следовательно buff(n-N)=buff(0)
    Q[1]=a*Q[0]+b*(I[0]+ADC[n]-buff[0]);
    for (int nn=0; nn<69; nn++) //перемещаем элементы массива на 1 влево
    {
        buff[nn]=buff[nn+1];
    }
    buff[69]=ADC[n]; //Заносим полученное значение АЦП на данном цикле работы алгоритма в последний эллемент буфера
    module = sqrt(I[1]*I[1]+Q[1]*Q[1]); //вычисляем модуль комплексного числа
}
//конец работы алгоритма
}

Для удобства чтения скрин из саблайма: screenshot

В итоге имею изменяющийся модуль, хотя, как я понимаю, его значение должно быть постоянным и максимальным про наличии искомой частоты:

Скрин вывода программы переменной module:screenshot

Что я делаю не так?

Сообщение отредактировал Lost_Viking - Jan 21 2016, 08:19
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 24)
Lost_Viking
сообщение Jan 21 2016, 17:32
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Так, нашел один косяк. Аргумент косинуса и синуса в радианы забыл перевести. Но проблему не решило
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Jan 22 2016, 13:45
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Похоже, что никто помочь не может. Жаль
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Jan 23 2016, 12:15
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Так, разобрался. Алгоритм полностью рабочий, несмотря на некоторые заявления тут.
Просто я кое в чем запутался. В аргумент косинуса и синуса нужно было подставлять не частоту, а номер спектрального отсчета, соответствующий частоте. И, соответственно, в радианы переводить ничего не надо. Ну, и еще длину буфера сделать не 70, а 90. Тогда 9000гц (Fd)/90= 100. То есть шаг по частоте 100гц.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 23 2016, 12:51
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Lost_Viking @ Jan 23 2016, 15:15) *
Так, разобрался. Алгоритм полностью рабочий, несмотря на некоторые заявления тут.

Так кладите его сюда. rolleyes.gif
Go to the top of the page
 
+Quote Post
petrov
сообщение Jan 23 2016, 20:40
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(Lost_Viking @ Jan 23 2016, 15:15) *
Так, разобрался. Алгоритм полностью рабочий, несмотря на некоторые заявления тут.


Сам Бернард Уидроу наговаривает на полностью рабочий алгоритм:
http://www-isl.stanford.edu/~widrow/papers/j1995onthe.pdf
:D
Go to the top of the page
 
+Quote Post
andyp
сообщение Jan 24 2016, 19:00
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(Lost_Viking @ Jan 22 2016, 16:45) *
Похоже, что никто помочь не может. Жаль


Из статьи на dsplib
http://www.dsplib.ru/content/goertzelmod/goertzelmod.html
видно (формула 9), что предлагаемый фильтр нестабилен (его полюс лежит на единичном круге в комплексной плоскости, см. https://en.wikipedia.org/wiki/Infinite_impulse_response пункт 3 - Stability). Ну чем еще тут можно помочь??? Разве что, как petrov, привести более работоспособный алгоритм.
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Jan 24 2016, 20:47
Сообщение #22





Guests






Ну.. я не знаю уж.. Как-тщ со студентами занимался моделированием DTFM.
Мой софт (exe без вирусов):

https://mega.nz/#!XhgmjIya!opfZwvRq...XDDeoKqpCMzE1vE
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Mar 3 2016, 16:10
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Чуть позже отпишусь, когда все отлажу. Ждите.

все рассуждения на dsplib. Как что-то появится толковое, так сюда отпишусь
Go to the top of the page
 
+Quote Post
Lost_Viking
сообщение Mar 4 2016, 13:53
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091



Записал видео с своей реализацией https://youtu.be/FhoelOKbjfk?t=964 . Сильно не пинайте за путаницу в терминологии, и за неуверенность в некоторой матчасти. Видео около часа длительностью. Примерно с 16 минуты запускаю алгоритм, и начинаю тестить и показывать что получается. В итоге прихожу в ступор.

Буду думать дальше
Go to the top of the page
 
+Quote Post
petrov
сообщение Mar 4 2016, 15:36
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(Lost_Viking @ Mar 4 2016, 16:53) *
Записал видео с своей реализацией https://youtu.be/FhoelOKbjfk?t=964 . Сильно не пинайте за путаницу в терминологии, и за неуверенность в некоторой матчасти. Видео около часа длительностью. Примерно с 16 минуты запускаю алгоритм, и начинаю тестить и показывать что получается. В итоге прихожу в ступор.

Буду думать дальше



Полезно мысленно рассмотреть как одиночный импульс проходит через такую структуру скользящего среднего(для упрощения на нулевой частоте). Если возникают ошибки в интеграторе или в линии задержки перед ним, то эти ошибки будут циркулировать в интеграторе бесконечно, никакого КИХ фильтра скользящего среднего не получится. Ещё один вариант избежать ошибок округления в интеграторе - вынести поворачивающий множитель перед интегратором, он получится переменным.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th August 2025 - 00:07
Рейтинг@Mail.ru


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