Jump to content

    

p_v

Участник
  • Content Count

    143
  • Joined

  • Last visited

Community Reputation

0 Обычный

About p_v

  • Rank
    Частый гость

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1557 profile views
  1. @_pv Ну главное что плюс-минус лапоть похоже. Все равно будет быстрее, чем отсчеты набегут. Пока остановился на том, чтобы тупо фигачить БПФ на 1024 точки, слегка похерив точность на низах. Подкупает простотой.
  2. Если быть точнее, там выпрямленное напряжение, поэтому 100 либо 120 герц, плюс конская вторая гармоника, и возможно приличные третяя-четвертая. Поэтому надо сурово резать от нуля до 400 - 480 герц. И учитывать от 600 герц. Чтобы такое разделить - это от десятого порядка фильтры. Без плавучки - либо каскады IIR либо очень длинный FIR. Можно, но пипец как грустно. Часто встречал такую оценку на этом форуме. А для каких она условий? Случайно не для аппаратной плавучки? https://community.st.com/s/question/0D50X00009XkhK9/fft-in-stm32f0 - тут в четветом ответе пишут для M0+ 600К циклов на 1024 точки для Q15 (мне возможно понадобится Q31, т.к. постоянная составляющая очень большая).
  3. @_pv Теперь понял, спасибо. С одной стороны, ваш график выглядит довольно убедительно. С другой, по предыдущему проекту мне показалось что производные на шумных сигналах довольно кривоваты. Плюс подсчет девиации - не самая дешевая штука. Скажем так, скорость самого БПФ на 1024 точки не самый критичный кусок. Там больше прижимает время набора отсчетов (1000/16000 => 0.0625 сек). Я пока попробую на БПФ, т.к. там предсказуемый результат, но если что-то пойдет не так - буду думать над вашим. PS. Ну и что скрывать, просто интересно БПФ поюзать.
  4. Я не понял, что это за магия, и почему она вдруг стала пропорциональна оборотам, а не погоде на марсе например. Так тоже можно наверное. Но по-моему это не улучшает более простой вариант - померить максимум на самых низких оборотах, и рубить все что меньше 70% (в текущих исходниках так и сделано). Либо я мог упустить какую-то важную мысль, тогда напишите пожалуйста точную формулу, что вы впредлагаете для порога.
  5. Задача: хочется определять обороты коллекторного двигателя по пульсациям тока, которые вызывает переключение обмоток. И чтобы математика на Cortex M0+ вписывалась в 0.1 сек за итерацию. Искомая частота - 600...6000 герц (450...45000 rpm для 8-полюсного коллекторника бормашинки). Желаемая точность измерений - 1% (относительно измеряемой частоты) В предыдущей теме я спрашивал про рекурсивные фильтры. В общем, полазал по интернетам, решил делать через БПФ, почистил код, и вопросы стали другие. Поэтому новая тема. Что имеем: https://github.com/speedcontrols/dc_sc_grinder/tree/scripts/scripts - исходники, с которыми экспериментирую (в бранчах есть полные дампы). Написал честный FIR-дециматор, и перегнал дампы на 16 килогерц (примерно как в реальном девайсе) Дампы и прочие выклопы нормализовал в целочисленные. Дамп на высоких оборотах Дамп на низких оборотах Спектр на высоких оборотах, 512 точек, обнулена постоянная составляющая (чтобы не портила масштаб). ~ 32 герца на точку. Нужен второй большой пик (который "троится"). ~ 4000 герц, похоже на правду (30000 rpm). Спектр на низких оборотах, 512 точек, обнулена постоянная составляющая. Тоже второй пик, ~ 600 герц (4500 rpm), сходится. С точностью на низах примерно понятно. Если видим что пик внизу - включаем ресамплер, и делаем FFT еще раз. Сетевые пульсации и гармоники в стороне от нужного диапазона - можно спокойно игнорировать. Правда, критично вырастает время выборки. Получается 0.8 сек при точности 1.3%. Терпимо. В крайнем случае похерю точность до 2%, приподняв частоту самплинга. Остались вопросы: Что все-таки смотреть после FFT, реальную часть или корень из суммы квадратов? Просто искать максимум или как-то проверять соседние отсчеты? Как определять "отсутствие" оборотов (или когда ниже допустимых, что актуально для старта). Ведь если PID/ADRC подхватит ложный пик - может не дать разогнаться. Мерить при калибровке амплитуду частоты на низах и ставить порог в половину? Есть ли смысл накладывать перед FFT оконную функцию? Может еще чего-то не знаю и пропустил?
  6. Надо 1% точности, да по корявому сигналу. На низко-порядковых фильтрах откровенно стремно. Есть вопросы По БПФ. Где можно посмотреть, как выбирать "разрядность" (Q15?) и сколько циклов займет на Cortex-M0+ 256 точек? По ресамплингу. Что использовать на МК для понижения частоты в 2^n раз? Децимация там тривиальная, но еще ведь фильтр нужен. По поводу точности. Если правильно понимаю, то для погрешности меньше 1% во всем диапазоне мне надо Constant-Q transform. Чтобы не мудрить с имплементацией, можно сделать в 2 фазы: Делаем БПФ на 32 точки, чтобы грубо определить искомый диапазон. Включаем нужный ресамплинг (отрезаем выше искомого диапазона), набираем новые данные и делаем БПФ по 128-256 точкам. Т.к. после ресамплинга искомый диапазон всегда окажется в верхней половине, точность определения частоты будет достаточной. Я в правильном направлении думаю?
  7. Вот графики из предыдущего поста, но с вырезанными 30 отсчетами в начале (отбрасываем 0-450 герц, чтобы не херили масштаб) hilda_250kHz_rpm_low.txt hilda_250kHz_rpm_high.txt Вроде нужные пики хорошо видны. На втором графике, правда, двоятся, но это не критично. А можно FFT как-то "ступенчато" считать? Сначала 32 точки, чтобы отбросить 0-400 герц и найти диапазон с пиком, а потом уже найденный диапазон просчитать точнее?
  8. Ну нема в контроллере флоатов, и тем паче даблов. А скриптами я эмулирую то, что потом в контроллере реально повторить. Хм... промахнулсо. Поправлю. Правда я дрюкал дамп _high (максимальные обороты), там ничего не задето. Но для low не прокатит, вы правы. Откачу на 400 герц, чтобы хотя бы первые 3 гармоники прибрать. Максимальная частота тогда получается 4-6 килогерц (30000-45000rpm). И еще, на дампах забыли тахометром обороты померить, так что я не знаю, какие на _low. Знакомый питал хильду с автотрансформатора через выпрямитель. Мог меньше выставить. Я плохо представляю, как сделать высокочастотный ШИМ без выпрямления. А если делать фазовую регулировку симистором, там спектр должен еще сильнее убиваться. Диаграммы снимали, мне с них сигнал совсем не понравился, поэтому даже не стал в репозиторий заливать. Переделал спектрограммы, без фильтрации. 250000/16384 => 15,2588 - шаг в герцах на 1 точку. hilda_250kHz_rpm_low.txt Виден пичок на ~ 600 герцах => 4500 rpm. охоже на правду hilda_250kHz_rpm_high.txt Группа пиков около 3600 Гц (возможно обороты слегка дрожат) => 27000 rpm. Тоже похоже на правду. Еще какой-то паразитный пик на 2800 Гц, фик знает почему. Может обмотки не симметричные. Я могу понять как это даст пики на 1/8 частоты от основной, но не понимаю откуда 3/4 берутся. @Самурай, проверьте, может ваш спектроанализатор хочет в качестве разделителя точку а не запятую. У вас очень странный результат выходит. Хочется определять обороты универсального двигаетеля (в бормашинке) по частоте колебаний тока. Через противо-ЭДС уже сделано, работает приемлимо, но хочется еще лучше. Судя по прикрепленным сонограммам, задача имеет решение. Но надо разобраться, возможно ли оно на чахлом контроллере. Текущая гипотеза - попробовать почистить сигнал и померить период через zero cross.
  9. Не понял. Я в спектр раскладываю предварительно фильтрованный сигнал. На последних графиках отрезано ниже 800 и выше 15000 герц. Иначе сетевые пульсации все забьют нафик. Соответственно, из за high-pass 800hz постоянная составляющая уходит. У бормашинки минимально возможные обороты 4500 rpm. При восьми полюсах это 1500 герц. Вроде параметры пред-фильтра адекватные, режут мусор но лишнего не задевают.
  10. Какая-то у вас ерунда со спектром. Наверное надо все-таки 100 герц и их гармоники сначала обкоцать. Еще в бренче "raw_data" лежат семплы на 250 килогерц. Лучше пока их юзать, чтобы не было всяких левых отражений. 50 килогерц я сделал простым прореживанием, это не совсем корректно. Вроде разобрался с FFT. Выборка 250 килогерц, 16К точек, на графиках первые 1024 точки abs(real) sqrt(real^2 + imaginery^2) Не знаю, по какому правильнее смотреть, вроде по первому? Ну какбэ фундаментальная частота видна довольно четко. Но т.к. полюсов коллектора восемь, они похоже суб-кратными частотами знатно подсирают в нижнем спектре (меньше фундаментальной частоты). Непонятно как это простыми IIR фильтрами надежно обкоцать.
  11. Прогнал сэмплы через эту библиотеку https://github.com/indutny/fft.js, 16834 отсчетов, частота 250 килогерц. const FFT = require('fft.js') const fft_size = 16384 const fft_input = Array.from(data.subarray(4000, 4000 + fft_size)) const fft_out = new Array(fft_size) const f = new FFT(fft_size) f.realTransform(fft_out, fft_input); f.completeSpectrum(fft_out) Не уверен что правильно использовал, на выходе получается 32К точек, на графике первые 2000 (дальше либо нули либо мусор): По-моему я где-то налажал - непонятно откуда отрицательные значения, и ниже фундаментальной частоты какой-то понос, которому я не могу найти физического объяснения (даже не симметричные полюсы не должны такой размах давать). Есть идеи что подкручивать?
  12. Ну если быть реалистом, то для юзеру отклонение оборотов бормашинки на 10% глубоко пофик. Если учесть запас для работы ADRC т.п. - погрешность меньше 1% точно не нужна. Мне это только для отладки, проверять что фильтры вывалили. По низам какая-то хрень прет, на глаз не видно, в каком количестве и можно ли тупо порогом по амплитуде отсечь. Нашел готовую библиотеку яваскриптовую, ща залеплю туда 16К отсчетов и посмотрю что на графике получится. В идеале ведь сигнал содержит частоту, пропорционалдьную оборотам, и 100 герц. Поэтому теоретически достаточно через ФВЧ полностью завалить 100 герц, а дальше сделать сетку ФНЧ в диапазоне 500-15000 герц, и подобрать ближайший к нулю, который начнет пропускать сигнал (это и будет наша искомая частота). Но в реальной жизни, есть гармоники, прострелы, и по низам не 100 герц синус, а выпрямленные пульсации, у которых спектр более размазан. Поэтому приходится колдовать с выпиливанием кусков входного сигнала и порогами. Но без сонограмм не всегда хорошо вижно, насколько изменения эффективны. Можно наверное то же самое сделать через DFT, забив несколько таблиц с шагом 2, 4, 8, ..., и "уточняя" только тот участок где найден максимальный пик спектра. Но по-моему с фильтрами проще. Заранее прошу прощения если какие-то вопросы глупые, просто цифровой обработкой сигналов толком не занимался. Но я какбэ программист, просто хочу алгоритм из готовых кусков слепить, не погружаясь в пучины формул. Задача-то прикладная, а не теоретическая. https://oshwlab.com/speed/dc-speed-control Cortex-M0+. В наличии только умножение 32*32. То есть, вычисления с фиксированной точкой 16.16 (или может быть 8.24). Отсюда и батерворты 2 порядка, объединенные последовательно. Другие конфигурации от нехватки точности расколбасит. Спасибо что не пожалели времени. IMHO в медианном фильтре не будет особого смысла, т.к. с теми пиками, которые он способен вырезать, ФНЧ высокого порядка справится не хуже. А он намного проще. Ну и как я писал выше, если процессить не все полуволны целиком, а у каждой похерить 25% с начала и 25% с конца, то прострелы станут не особо критичными. В общем, мне нужна небольшая пауза, чтобы привернуть генерацию сонограммы. По ней сразу станет понятно, что и каким способом резать.
  13. Переделал фильтры на "канонические". Принципиально ничего не поменялось. Но теперь хотя бы нет сомнений, что фильтры правильные. @thermit, еще раз спасибо. Это после ФНЧ 15 кГц (батерворт, 2 порядок, 4 раза) Это после ФНЧ 15 кГц и ФВЧ 300 Гц. Похоже после выпрямления напряжения излом около нуля заметно подгаживает в нижнем спектре. Из того что вижу - похоже есть смысл просто отбросить сигнал около нулевого напряжения. Там самые странные "прострелы" пиков Возможно, отуда больше всего прилетает по низким частотам (ниже фундаментальной, которую ищем) Дальше строим несколько сеток полосовых фильтров, уменьшая шаг сетки, и "половинным делением" подбираем полосу, когда сигнал станет больше какого-то порога. Ширина полосы должна быть ~0.7 в каждую сторону от середины, чтобы гармоники не прихватить. В фурье перегонять не хочется - дорого. Теоретически в конце должен остаться голый синус, у которого уже по zero cross можно определить точную частоту. Осталось понять, как вычислять порог полезного сигнала (когда с выхода полосового фильтра фундаментальная частота поперла). Из того что приходит в голову - на исходном сигнале взять положительную часть, посчитать среднее арифметическое (что-то типа средней амплитуды), и порогом принять 25-50%. Я в привильную сторону думаю? И еще вопрос. Можете дать ссылку на проверенные исходники фурье, которые по массиву сэмплов строят спектрограмму с заданной точностью? Чтобы просто выдавала массив чисел, которые можно в эксель закинуть, как на графиках выше.
  14. Напарник откуда-то сам выводил, поэтому немного не классическая запись получилась. У нас разделение труда, я не лезу в математику/физику пока совсем не припрет. Спасибо за формулы, буду перепроверять. Похоже пора все к канонической форме привести, для начала. Кому интересно, исходный сигнал - ток коллекторного мотора, по которому пытаемся определить обороты (в репозитории есть дампы). При вращении происходит перекоммутация обмоток, и это вызывает весьма заметные колебания, пропорциональные оборотам и количеству полюсов. Из помех - какие-то адские рандомные "прострелы", плюс 100 герц из сети. На первый взгляд - ничего такого, что нельзя было бы почистить простенькими фильтрами. Частота сигнала в диапазоне 500-15000 герц. Дискретизация сейчас 250 килогерц, чтобы пока не возиться с пред-фильтрацией, в реальном девайсе в итоге будет ~50 килогерц.
  15. Если речь об исходниках, которые я прошу проверить, то да, там стандартная терминология, -3дБ. Ну вроде это не должно стать большой проблемой. Мне фильтры из каскадов второго порядка нужены только для выделения чистого синуса, а точное значение я все равно по zero-cross буду определять. Как вариант, если знаете проверенные исходники для батерворта второго порядка, такие же простые как у меня, дайте ссылку. Переписать недолго.