Jump to content

    
p_v

Проверьте пожалуйста алгоритмы IIR фильтров

Recommended Posts

17 minutes ago, thermit said:

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

Не понял. Я в спектр раскладываю предварительно фильтрованный сигнал. На последних графиках отрезано ниже 800 и выше 15000 герц. Иначе сетевые пульсации все забьют нафик. Соответственно, из за high-pass 800hz постоянная составляющая уходит.

 

У бормашинки минимально возможные обороты 4500 rpm. При восьми полюсах это 1500 герц. Вроде параметры пред-фильтра адекватные, режут мусор но лишнего не задевают.

Edited by p_v

Share this post


Link to post
Share on other sites
1 час назад, p_v сказал:

Я в спектр раскладываю предварительно фильтрованный сигнал. На последних графиках отрезано ниже 800 и выше 15000 герц. Иначе сетевые пульсации все забьют нафик.

Для ДПФ/БПФ в предварительной фильтрации в данном случае нет никакого смысла. Разумеется, если все операции делать на даблах/флоатах.  

1 час назад, p_v сказал:

У бормашинки минимально возможные обороты 4500 rpm. При восьми полюсах это 1500 герц.

4500*8/60 = 600Гц. Разве нет? Ниже часть спектра для hilda_250kHz_rpm_low, 100к отсчетов, по оси х частота в Гц. Хорошо виден пик как раз на 600Гц. Это хорошая новость. Плохая новость в том, что этих пиков там как.... Много в общем. А самое скверное, что по амплитуде они не очень то сильно и отличаются. Совершенно не очевидно, что пик на 600Гц, это та самая искомая частота...

Low_0_3k_100k_250kHz.thumb.jpg.34d135a56c249b0081c9134b2ca9061c.jpg

 

И еще пара нюансов:

1. Если сигнал не выпрямлять перед оцифровкой, то количество пиков будет существенно меньше.

2. Явно не хватает разрядности АЦП.

Share this post


Link to post
Share on other sites
3 часа назад, thermit сказал:

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

Вам нужно внятно сформулировать задачу для начала. Заниматься хиромантией лично у меня никакого желания нет.

Share this post


Link to post
Share on other sites
1 hour ago, Самурай said:

Для ДПФ/БПФ в предварительной фильтрации в данном случае нет никакого смысла. Разумеется, если все операции делать на даблах/флоатах.

Ну нема в контроллере флоатов, и тем паче даблов. А скриптами я эмулирую то, что потом в контроллере реально повторить.

 

1 hour ago, Самурай said:

4500*8/60 = 600Гц. Разве нет?

Хм... промахнулсо. Поправлю. Правда я дрюкал дамп _high (максимальные обороты), там ничего не задето. Но для low не прокатит, вы правы. Откачу на 400 герц, чтобы хотя бы первые 3 гармоники прибрать. Максимальная частота тогда получается 4-6 килогерц (30000-45000rpm).

 

И еще, на дампах забыли тахометром обороты померить, так что я не знаю, какие на _low. Знакомый питал хильду с автотрансформатора через выпрямитель. Мог меньше выставить.

 

1 hour ago, Самурай said:

Если сигнал не выпрямлять перед оцифровкой, то количество пиков будет существенно меньше.

Я плохо представляю, как сделать высокочастотный ШИМ без выпрямления. А если делать фазовую регулировку симистором, там спектр должен еще сильнее убиваться. Диаграммы снимали, мне с них сигнал совсем не понравился, поэтому даже не стал в репозиторий заливать.

 

Переделал спектрограммы, без фильтрации. 250000/16384 => 15,2588 - шаг в герцах на 1 точку.

 

hilda_250kHz_rpm_low.txt

s_low_raw.thumb.png.2d559629d42dea5dca4a3a27c6ecc72b.png

 

Виден пичок на ~ 600 герцах => 4500 rpm. охоже на правду

 

hilda_250kHz_rpm_high.txt

s_high_raw.thumb.png.607c8e859c0e229f1f990942b15f2fdd.png

 

Группа пиков около 3600 Гц (возможно обороты слегка дрожат) => 27000 rpm. Тоже похоже на правду.

 

Еще какой-то паразитный пик на 2800 Гц, фик знает почему. Может обмотки не симметричные. Я могу понять как это даст пики на 1/8 частоты от основной, но не понимаю откуда 3/4 берутся.

 

@Самурай, проверьте, может ваш спектроанализатор хочет в качестве разделителя точку а не запятую. У вас очень странный результат выходит.

1 hour ago, thermit said:

Вам нужно внятно сформулировать задачу для начала. Заниматься хиромантией лично у меня никакого желания нет.

Хочется определять обороты универсального двигаетеля (в бормашинке) по частоте колебаний тока. Через противо-ЭДС уже сделано, работает приемлимо, но хочется еще лучше.

 

Судя по прикрепленным сонограммам, задача имеет решение. Но надо разобраться, возможно ли оно на чахлом контроллере. Текущая гипотеза - попробовать почистить сигнал и померить период через zero cross.

Share this post


Link to post
Share on other sites

Вот графики из предыдущего поста, но с вырезанными 30 отсчетами в начале (отбрасываем 0-450 герц, чтобы не херили масштаб)

 

hilda_250kHz_rpm_low.txt

s_low_raw2.thumb.png.a00be30a5eeb06167667a8c4fb508a59.png

 

hilda_250kHz_rpm_high.txt

s_high_raw2.thumb.png.e6c20119f10d393a793dfbf903bdf50f.png

 

Вроде нужные пики хорошо видны. На втором графике, правда, двоятся, но это не критично.

 

А можно FFT как-то "ступенчато" считать? Сначала 32 точки, чтобы отбросить 0-400 герц и найти диапазон с пиком, а потом уже найденный диапазон просчитать точнее?

Share this post


Link to post
Share on other sites

по условию задачи и по обсуждению выше, в цифровой обработке допускается использовать БИХ фильтры второго порядка (только если нет высоких требований к точности коэффициентов и к точности вычислений)

я отфильтровал сигналы из hilda_50kHz_rpm_high и hilda_50kHz_rpm_low в ВЧ фильтре с коэффициентами 

b = [1,-1]; a = [1,-0.9375]; 

с такой АЧХ:

23939753_.thumb.png.a7dbf642e016e9510092a184c3e60607.png

и затем отфильтровал в группе полосовых фильтров на разных частотах с такими коэффициентами:

Скрытый текст

f =   400; b = [  0.03281759059,0, -0.03281759059]; a = [1,     -1.9340458,         0.9375];
f =   900; b = [  0.03156366737,0, -0.03156366737]; a = [1,   -1.924120029,         0.9375];
f =  1400; b = [   0.0313784307,0,  -0.0313784307]; a = [1,   -1.906600635,         0.9375];
f =  1900; b = [  0.03131856954,0, -0.03131856954]; a = [1,    -1.88155676,         0.9375];
f =  2400; b = [  0.03129199717,0, -0.03129199717]; a = [1,    -1.84908724,         0.9375];
f =  2900; b = [  0.03127793598,0, -0.03127793598]; a = [1,   -1.809320217,         0.9375];
f =  3400; b = [  0.03126961201,0, -0.03126961201]; a = [1,   -1.762412634,         0.9375];
f =  3900; b = [  0.03126428538,0, -0.03126428538]; a = [1,   -1.708549613,         0.9375];
f =  4400; b = [  0.03126067664,0, -0.03126067664]; a = [1,   -1.647943728,         0.9375];
f =  4900; b = [  0.03125812333,0, -0.03125812333]; a = [1,   -1.580834161,         0.9375];

 

АЧХ фильтров:

2051006057_.thumb.png.a6e69bee6058ef93017062b1fb9262e5.png

от результата фильтрации в группе полосовых фильтров взял по модулю и накопил

процесс такого накопления в hilda_50kHz_rpm_high:

1770714601_.thumb.png.1f473eecfa47ae2c3ac88fdcca63d375.png

результат такого накопления:

17661489_.thumb.png.29edf940a7a0bf9a1afc1ff101023547.png

результат накопления для hilda_50kHz_rpm_low:

1454655599_.thumb.png.c6308a02e1db58fef6efe5c7704a7507.png

 

в сигнале hilda_50kHz_rpm_high больше всего накопил фильтр на частоте 3900. в сигнале hilda_50kHz_rpm_low больше всего накопил фильтр на частоте 400.

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

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

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

 

Share this post


Link to post
Share on other sites

Надо 1% точности, да по корявому сигналу. На низко-порядковых фильтрах откровенно стремно.

Есть вопросы

  • По БПФ. Где можно посмотреть, как выбирать "разрядность" (Q15?) и сколько циклов займет на Cortex-M0+ 256 точек?
  • По ресамплингу. Что использовать на МК для понижения частоты в 2^n раз? Децимация там тривиальная, но еще ведь фильтр нужен.

По поводу точности. Если правильно понимаю, то для погрешности меньше 1% во всем диапазоне мне надо Constant-Q transform. Чтобы не мудрить с имплементацией, можно сделать в 2 фазы:

  1. Делаем БПФ на 32 точки, чтобы грубо определить искомый диапазон.
  2. Включаем нужный ресамплинг (отрезаем выше искомого диапазона), набираем новые данные и делаем БПФ по 128-256 точкам. Т.к. после ресамплинга искомый диапазон всегда окажется в верхней половине, точность определения частоты будет достаточной.

Я в правильном направлении думаю?

Share this post


Link to post
Share on other sites

Я тоже сначала без плавающей точки бодался (На майкрочипе pic24). Потом плюнул на все и сделал честный float32. Памяти не хватало- добавил внешнюю последовательную RAM. И всем пофиг что он 10 секунд считает, зато с нужной точностью (4096 точек, по 16-битный данным АЦП).

Вот повозитесь Вы с этими всем (диапазон, ресемплинг, набираем новые данные...) и придете к классике.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.