Тег ‘программирование’

О – Оптимизм

osal_isr_register

Комментарию про “when functionality is complete” – уже семь лет. Впрочем, не первый раз замечаю за Texas Instruments такой подход – выкинуть “в окружающую среду” какие-то элементарные примеры работы с их микроконтроллерами, а на развитие и поддержку этого всего забить.

Как просрать 30 килобаксов на Firebase

Замечательную историю про программистов-недоучек нашел:

https://medium.com/@PurpleGreenLemon/how-not-to-get-a-30k-bill-from-firebase-37a6cb3abaca

Ребята знают модные слова Angular и Firebase, но не привыкли задумываться об алгоритмической сложности – пока не столкнулись с задачей, где буковки O(n2) превращаются во вполне реальные доллары.

Наконец-то объяснили разницу!

admin-vs-devops

Чтобы не пропало

Вот я тут в комментах у [info]mbr в очередной раз обосрал школьную информатику – но чтобы не пропало, вынесу сюда списочек “что должен знать интересующийся предметом старшеклассник”.

За “обязательный минимум” можно принять, скажем, COS 109 – курс Брайана Кернигана по “компьютерной грамотности” для студентов “нетехнических” специальностей в университете Принстона. Специально даю ссылку не на книгу (Understanding the Digital World), а на страничку курса – там есть довольно полезные “лабораторные работы” и наборы задач. В эти “лабораторные работы” входит, скажем, простой HTML, рисование фотожаб, работа с электронными таблицами, представление о программировании.

В этот минимум хорошо бы добавить еще умение пользоваться текстовым редактором и текстовым процессором (и понимание разницы между ними), какими-нибудь “мультимедийными” программами типа аудио- или видеоредакторов, 3D-редакторами, “переустановить винду” и вообще пользовательскую грамотность (не только применительно к ПК, но и для “мобильных устройств” с iOS или Android – как “перекинуть фоточки” и все такое).

Маленький дисклеймер – мне сейчас лениво искать образовательные стандарты и сравнивать их со своими представлениями о прекрасном – но скорее всего, “минимум” в моем представлении формально не покрывает даже “базовый” уровень (школьный курс информатики содержит немало странной фигни, почему-то считающейся обязательной), а следующая часть будет в отдельных случаях значительно перекрывать даже “профиль”.

Перейду теперь к “максимуму” – или “что должен знать юный программист”. По моему опыту, этот объем знаний вполне посилен интересующемуся школьнику, но намного превосходит то, что было бы разумно включить в школьную программу. В любом случае, от “начинающего программиста” хочется ожидать примерно следующего:

- знакомство с двумя-тремя (а может, и побольше) достаточно разными языками программирования; к примеру, я в старших классах, помимо стандартного школьного Паскаля, “пощупал” пару вариантов QBasic, Visual Basic, Delphi, C (и даже написал пару-тройку сравнительно больших программ под Windows), PHP (по статьям в журнале Ксакеп), пару “игрушечных” языков (из этой книжки) (RL – диалект Лиспа и “игру в схемы” – своеобразный HDL);
- к предыдущему пункту – знакомство, пусть даже поверхностное, на уровне “а это тоже можно программировать”, с парой разных “платформ” – скажем, можно пощупать “десктопные” приложения, браузерный Javascript, CGI-приложения, приложения для мобильников, прошивки микроконтроллеров;
- представление о различных алгоритмах и структурах данных – то есть все эти стандартные “сортировки пузырьком”, “красно-белые деревья” и все такое (к этому же пункту отнесу и “теоретическую информатику”, но возможно – в сильно урезанном даже по сравнению со школьной программой виде);
- представление о том, что такое реляционные базы данных, ER-модель, умение написать простой SQL-запрос;
- понимать, как работает современный веб – где выполняется Javascript, что такое веб-сервер, как работают CGI-приложения, как это все связано вместе;
- к предыдущему пункту – какие-то основы сетей – знать, что такое TCP, IP и еще куча буковок, уметь настроить WiFi-роутер и с помощью Wireshark подрезать чужой пароль;
- элементарные навыки работы/администрирования Unix-образных систем (”переустановить винду” относим к компьютерной грамотности) – поставить две ОС на одну машину, знать основные команды в терминале, уметь настроить веб-сервер, поставить Wordpress, вот это вот все;
- “практика с железом” – раньше я написал бы сюда “умение сделать нуль-модемный кабель для игры в Doom”, сейчас даже не знаю, что можно считать аналогичным – но что-то все равно надо;
- “как это все сломать” – условно говоря, основы хакинга – от SQL injection и cross-site scripting до использования ошибок типа переполнения буфера;
- знать полное собрание сочинений Дани Шеповалова.

Вот как-то так :)

Чуваки, я охуел

Вот на хабре статейка, в которой чувак описывает найденную им “пасхалку” в Android и последующее заваленное собеседование в Google:

https://habr.com/ru/post/442872/

Если коротко: при регистрации учетной записи Google на телефоне с Android скачивается небольшой apk-файл, который затем выполняется на устройстве пользователя. При этом гуглу передается довольно много информации, позволяющей этого самого пользователя идентифицировать и (здесь включается профессиональная паранойя) подсунуть ему “особый” исполняемый файл. Можно поступить и хитрее – в этом apk содержится интерпретатор некоего байт-кода, который, опять же, может делать довольно многое.

И вы действительно считаете, что все это придумано исключительно для “борьбы с ботами”?

А вот посоветуйте книжек

Насоветовал тут в фейсбуке кучку книжек по программированию микроконтроллеров:

https://www.facebook.com/tikhonovruslan/posts/2193043937400492

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

  • Что такое микроконтроллер? (опционально – что такое ARM, Cortex, STM32 и так далее)
  • Устанавливаем среду разработки (без нее вот просто никуда, даже светодиодом не поморгать без Keil)
  • Пишем простейшую программу (тут половина читателей отваливается, потому что даже “простейшая” программа требует шаманства в виде настройки тактирования, и идет делать сайты на PHP)
  • Работаем с GPIO
  • Работаем с таймерами
  • Работаем со всякой остальной периферией
  • Тема для продвинутых – что такое DMA и как с ним жить
  • Тема для очень продвинутых – как в CubeMX накликать в проект FreeRTOS

На этом “стандартный” курс заканчивается – но дальше-то что? Рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (или присутствует там с самого начала). При этом в литературе “для начинающих” это почему-то считается сложной темой, а книг “для продолжающих” почему-то нет. Вот где почитать, например, о том, как написать драйвер периферии или внешнего устройства? Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти – покажите мне книжку, где было бы достаточно подробно расписано, что происходит со стеком в многозадачной системе во время обработки прерывания?

В общем, что есть хорошего на эту тему “для продолжающих”, с описанием принятых “лучших практик”?

Отупляющие лучи с американских спутников

Посмотрел тут на несколько дискуссий с участием хаброюзера Jef239. Чувак работает в питерской фирме “Фарватер”, занимается там высокоточной навигацией с использованием ГНСС, а параллельно с работой – безвылазно сидит на хабре и строчит длиннющие простыни комментов, в которых либо делится своими взглядами на жизнь, воспитание детей и так далее, либо рассказывает, насколько сложна высокоточная навигация.

Что манера вести дискуссию, что стиль написания кода (можно ознакомиться в комментах на том же хабре) ужасно напоминают одного моего знакомого, по странному совпадению – тоже занимающегося высокоточкой. Интересно, заразно ли это и чем вызывается?

IT-держава, блядь

Запомните – первый шаг на пути к превращению в хохлостан – это употребление слов “IT-держава” с нескрываемой гордостью (когда гордиться больше как-то нечем):

https://ria.ru/20190217/1550981508.html

Но есть и здравомыслящие СМИ, понимающие место вклавиатурупальцемтыкальщиков в жизни и экономике:

http://ulgrad.ru/?p=177783

Дево-псам слова не давали

А дево-псам слова не давали. К ноге, сука. А еще тяфкнешь – забаню.

Здесь программисты общаются а не нетраханные кроссгендерные собаки.

Отсюда: https://vitus-wagner.dreamwidth.org/2061060.html?thread=51686148#cmt51686148

Проникся еще большим уважением к [info]vitus_wagner, большому мастеру слова.

Про malloc() и фрагментацию памяти

А вот чуваки придумали, как можно сильную фрагментацию памяти использовать для собственной выгоды – и сократили ее потребление Firefox’ом на 16%, заменив обычный системный malloc() на собственную реализацию:

https://arxiv.org/abs/1902.04738

Development and Deployment of Multiplayer Online Games

Посмотрел “бета-версию” будущей книжки Development and Deployment of Multiplayer Online Games: from social games to MMOFPS, with stock exchanges in between.

dnd-of-mog

Разумеется, она не столько про мультиплеерные игры, сколько про распределенные системы “вообще” – к таковым можно отнести, например, всякие там биржевые системы (автор, Сергей Игнатченко, упоминается тут, как один из разработчиков торговой системы РТС). Рассматривается буквально все – от нюансов программирования на C++ (вплоть до всевозможных заблуждений) до архитектуры “в целом“. Очень понравились главы про сетевое взаимодействие, выбор между TCP и UDP, некоторые неочевидные нюансы этих протоколов.

Сейчас вышел на бумаге первый том (из планируемых 9), почти готов второй, третий – в состоянии бета-версии (все три есть на Leanpub).

Боятся знать

Вот в твиттере @FelixTheBest – замечательный тред про программистов на C/C++ в сравнении с программистами на Java и Python, и в нем есть занятная формулировка:

люди, которые не знают C/C++ и даже боятся знать

Похоже, слова “боится знать” наилучшим образом описывают одного знакомого мне чувака, который прекрасно пишет что-то на Qt и современном C++ (это что-то в стиле, описанном в видеоролике Stop Teaching C) – но при этом панически боится plain C как “старого и низкоуровневого” языка. Собственно, это даже отвратило его от ардуины – так как там пропагандируется в лучшем случае C with classes. В общем, утащу себе определение.

Адитья Бхаргава, Грокаем алгоритмы

Мельком просмотрел тут одну детскую книжку по “алгоритмам”.

bhargava-algorithms

Удивлен большим количеством положительных отзывов на нее – причем ее рекомендовали, как вполне себе “взрослый” учебник, позволяющий быстренько подготовиться к собеседованию (собственно, вопросы “про алгоритмы” на программистском собеседовании – это некая форма карго-культа). На самом деле объем изложенного там материала катастрофически мал, местами вообще создается впечатление, что книга написана по принципу – взять “полноценный” учебник по “алгоритмам” (что-то типа Кормена или Дасгупты), выкинуть все сложное, а оставшееся максимально упростить. Все это разбавляется некоторым количеством смешных картинок – и готово.

Возможно, это и неплохо для детской книги – даже очень талантливый и старательный семи-восьмиклассник вряд ли будет настолько усидчив, чтобы самостоятельно разрисовать что-то вроде диаграммы стековых вызовов для несложной рекурсивной функции, а здесь она приведена в готовом виде – но есть несколько “сюжетов”, которые при таком подходе очень сильно “повисают в воздухе”. Особенно почему-то досталось O-нотации, которая здесь изложена в виде “как ее понимает средний программист” (а уж подсчет сложности тривиальной сортировки – O(n2) – во второй главе – это просто песня!).

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

https://algs4.cs.princeton.edu/cheatsheet/

Вот люди электросчетчик сделали

Недавно на хабре появилась очередная полезная статья Олега Артамонова – об оптимизации потребления устройств на микроконтроллерах. В заключительной части мельком упоминалось о “полусамодельном” устройстве, используемом в Unwired Devices для измерения энергопотребления – которое в последнее время сильно улучшилось и превратилось в самостоятельный продукт (и да, его можно купить).

energymon

Разумеется, это “не только счетчик” – раз уж тут стоит микроконтроллер, то его стоит “загрузить” дополнительными задачами, так что здесь есть еще “мост” USB-UART и совместимый с CMSIS-DAP отладчик (а заодно можно использовать устройство в качестве электросчетчика в домике Барби, по масштабу подходит идеально). Это все крутится под управлением довольно нетривиальной прошивки – тут вам и срабатывающий раз в 3 микросекунды АЦП, и выдаваемые с периодичностью в 10-100 миллисекунд данные об энергопотреблении, и обновляемый раз в секунду экранчик – в общем, от написанной в стиле “бесконечный цикл” прошивки DAP42 здесь получается практически настоящая, но очень маленькая RTOS.

Да, не все пока работает идеально гладко (тем более, что основной упор при разработке делался на мониторинг энергопотребления, а мост USB-UART и отладчик – это “бонусы”) – но исходники открыты и выложены на гитхаб, так что при желании в них можно покопаться (чем я и занимаюсь сейчас, пытаясь добиться работы этого всего в полном объеме с некоторыми микроконтроллерами TI):

https://github.com/unwireddevices/dap42

Больше всего мне интересно, конечно, другое – рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (собственно, с UMDK-ENERGYMON это уже случилось). А вот в какой момент там появится “заново написанная, неспецифицированная, глючная и медленная реализация половины языка Common Lisp”? Впрочем, парсер консольных команд уже есть.

Learn to code

Пишут, что в Штатах “альтернативно правые” издеваются над уволенными из всяких там Баззфидов и прочих Хаффингтон Постов журналистами, предлагая им “научиться программировать”:

https://thinkprogress.org/learn-to-code-decoded-the-campaign-against-laid-off-journalists-is-harassments-new-frontier-20725ddd480a/

И вот такой у нас Industrial IoT

Извините, но я снова про немцев. Оказывается, Dr. Ing. Michael Schoeffler на гитхабе пишет про себя так:

I’m a research engineer working in the field of Industrial IoT.

Парочка примеров кода от инженера-исследователя, работающего в индустриальном IoT:


void loop() {
  if (Serial.available() > 0) {
    byte incomingByte = 0;
    incomingByte = Serial.read(); // read the incoming byte:
    if (incomingByte != -1) { // -1 means no data is available
      lcd.setCursor(0, 0); // set cursor to first row
      lcd.print("I received: "); // print out to LCD
      lcd.setCursor(0, 1); // set cursor to secon row
      lcd.print(incomingByte); // print out the retrieved value to the second row
    }
  }
}

О существовании буквы “я”, конечно, в индустриальном IoT можно не задумываться.


long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value
  char* copy = malloc((sizeof(char) * length) + 1);
  memcpy(copy, str, sizeof(char) * length);
  copy[length] = '\0';
  // the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated.
  long value = strtol(copy, NULL, 16);  // strtol converts a null-terminated string to a long value
  free(copy); // clean up
  return value;
}

malloc() на микроконтроллере – это, несомненно, очень индустриально.


accelerometer_x = Wire.read()<<8 | Wire.read(); // reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)

Я бы еще вписал где-нибудь в этой программе i++ + ++i.

А вы говорите Bosch, настоящее немецкое качество и все такое.

Про немецкие компьютерные науки

Нет, не пугайтесь, бложик пока еще не захвачен [info]vit_r. Но вот набрел на пару интернетовских страничек немецких, так сказать, “компьютерных ученых” – и мне они показались в некотором роде заслуживающими внимания.

Случай первый – Dr. Christian M. Meyer, читает в многострадальном TU Darmstadt (вот им сейчас икается, наверное) курс под названием типа “XML и цифровые публикации”. По факту – это довольно плохой курс по Perl с немного непонятным назначением – вот зачем “компьютерным филологам” знать о тонкостях написания CGI-скриптов? А ведь это, с точки зрения герра Майера, важнейшая вещь в “цифровых публикациях”. Впрочем, он весьма разносторонний человек, помимо науки, увлекается фотографией, любит путешествовать, и даже написал какой-то дурной детектив. Но все впечатление убивается буквально одной ссылкой – оказывается, он со-основатель и управляющий партнер в фирме HESCOM-Software. Всего в фирме числятся три человека – так что о весомости этих титулов можно похихикать. Но с другой стороны – а вдруг эта фирма занимается чем-то удивительно высокотехнологичным и уникальным? И следующий же щелчок мышкой развеивает эту иллюзию – фирма лепит интернет-магазины в стиле середины 2000-х, а заодно продает две программки для составления каталогов книг и антиквариата. Не знаю, как вы, а я бы особо не афишировал, что являюсь в такой шараге “управляющим партнером”.

Случай второй – Dr. Ing. Michael Schoeffler пишет, что работает в исследовательском отделе компании Robert Bosch GmbH, а в свободное от работы время на серьезнейших щщах пишет в своем бложике “как прикрутить чего-нибудь к ардуине” (вот от методов работы с ультразвуковым датчиком я даже подохуел слегка). Нет, я, конечно, видел и отечественных кандидатов технических наук, но к работе с ардуиной в стиле кружка “юный радиогубитель” они скатываются обычно по мере приближения к маразму, а здесь на фотографиях мы видим вполне себе молодого человека.

В общем, даже священные войны Олега Артамонова с разработчиками RIOT OS (которые сидят в Берлине) на таком фоне выглядят как-то по-другому.

PS Для желающих рассказать в комментах об АБС фирмы Bosch – ссылка на статью в “Авторевю” у меня уже есть: https://autoreview.ru/articles/po-dorogam-i-bez-nih/otkat-patriota

Вот кстати вынесу из комментов

[info]sanches вспоминает, как раньше трава была зеленее – в чем я с ним абсолютно согласен, ибо прохожу как раз по нижней возрастной границе указанного им поколения – “люди, начиная где-то от 30+ и далее везде, – сильно, сильно старше. Которые успели застать вот эту вот революционную вакханалию, – когда каждый год появлялось что-то принципиально новое.” В комментариях, правда, почему-то перешли к теме дороговизны российского интернета – что является очередным странноватым мифом. В Москве и ближайших окрестностях честный домашний безлимит стоит от 400 рублей (около 6-7$) в месяц, мобильный интернет – что-то около 1$ за гигабайт (с мест сообщают, что есть вариант неслыханной щедрости – 992 рубля в месяц за безлимитный домашний и мобильный интернет на хорошей скорости – соответственно 100 и 4,1 Мбит/с).

Интереса ради посмотрел цены у провайдеров в Берлине (Европа, все дела) и Нью-Йорке. Берлин “обрадовал” тарифными планами от 15 евро в месяц за “безлимит” 16 Мбит/с или мобильными тарифами с абонентской платой 25 евро в месяц (в это включено 2-3 Гб интернет-трафика). В Нью-Йорке со скоростями получше – рекламируются тарифы от 155 Мбит/с до 1 Гбит/с (мелким шрифтом, правда, написано – experienced speeds may vary) по цене, соответственно, от 30 до 50 долларов в месяц. Сотовые же операторы в Америке дерут 30 долларов за тариф с включенными 6 Гб интернет-трафика (на самом деле там 3 Гб, и это “спецпредложение”).

В общем, не первый раз уже вижу мнение, что у нас в России отсталое IT, а вот на Западе – там ух! – и тарифы на интернет это только одно из его проявлений. Сам лично наблюдал некоторую разницу в восприятии одной и той же программы для планшета, когда она “мимикрировала” под иностранную и когда позиционировалась как отечественная. Да даже больше скажу – совершенно банальная электронная приблуда, Bluetooth-адаптер для датчика пробега, вызвала откровенное удивление, когда я сказал, что собрана она в России вот этими самыми руками (хотя зачем я зачеркиваю? все правда). Так вот, разочек попробовал осознать “место России в мировом IT” в комментариях у [info]32bit_me – и приведу здесь этот комментарий с минимальными правками (в первой его версии я безбожно забыл про Южную Корею):

Ах, это вечная русская тяга к самоуничижению :) Если разговор заходит об IT – то “сравниваться” надо с “англоязычными странами” (какими именно, кстати? не проще ли вместо двух десятков букв написать всего три – США?), “Индией, Китаем или даже Японией”. В разговоре про автомобили – никак не обойтись без сравнения “Жигулей” и БМВ, ну и так далее.

А если посмотреть на общий уровень “развитых стран” (https://en.wikipedia.org/wiki/Developed_country – в любом из вариантов), да еще и присовокупить к ним Китай и Индию? Сколько из них имеют свой интернет-поисковик, забарывающий на локальном рынке Google? Социальные сети круче Facebook? Где есть СУБД, до разработчиков которой можно донести необходимость внедрения закладок от АНБ/алгоритмов шифрования ГОСТ/”великого китайского файрволла”? Кто балуется утопическими проектами типа “русской/китайской/etc” ОС или “собственной” (в кавычках, потому что тут можно зайти далеко, вплоть до идей чучхе) электроники?

Тех, кто может осилить вот такой full-stack, похоже, нет вовсе; в той или иной степени – это будут США, Южная Корея, Китай и Россия; возможно – Евросоюз совместными усилиями, насчет Японии сказать ничего не могу, в плане Индии – очень сильно сомневаюсь. По-моему, быть даже в такой “семерке” вполне достойно – а может, речь идет и о тройке лучших.

Как говорится, discuss.

О смягчении нравов, продолжение

Поиграл тут еще с некоторыми примерами от NLTK. Был неприятно удивлен производительностью и тем, как эта штука жрала память, урча маянезиком. Я пока особо не лез во внутренности nltk.probability.FreqDist (подозреваю, что во всем виноват этот класс), но кажется, это довольно примитивная обертка над обычным ассоциативным массивом – так что я удивлен вдвойне тем, что на небольшом, в общем-то, наборе данных отожралось 2-3 гигабайта памяти “на ровном месте”. Задача в целом довольно тупая – надо найти в тексте наиболее часто встречающиеся последовательности из нескольких подряд идущих букв (это называется “символьные N-граммы” и иногда даже используется).

Задача в общем-то тривиальная, и на любом нормальном языке программирования решается почти элементарно – я оценил бы простое решение (без поддержки Unicode, только для одного-двух языков, etc) на plain C где-то в пару часов работы. Расход памяти – небольшой, сравнимый с объемом данных – думаю, что в мегабайт даже можно уложиться. Скорость работы – ну не знаю, сколько там времени надо на проход по массиву? Ну да, я понимаю, что показывать NLTK программистам нельзя – но вот я уже как-то сомневаюсь, что с его помощью можно решать задачи филологов.

Но самое важное – запускали мы это на Macbook Air 2015, кажется, года – и до вчерашнего дня его хозяйка не знала, какой там стоит процессор и сколько памяти. Для любых нормальных человеческих задач (ну там сайтики, кино, музыка) их в целом хватало. И вот с одной стороны, конечно, хорошо, что сейчас, в 2018 году, о том, что такое процессор, и сколько в твоем ноутбуке оперативной памяти, и даже о том, зачем она нужна, можно не задумываться. А с другой – даже эти невероятные по меркам двадцатилетней, скажем, давности (да, я такой старый, что у меня еще остались недоигранные партии в HoMM II) ресурсы все равно тратятся каким-то диким образом. Какой-нибудь примитивный байесовский классификатор (их с середины 90-х используют для определения, является ли email спамом или нет) требует для своего функционирования несусветных объемов памяти, а работает неприлично медленно.

А вот посоветуйте, что почитать

В одном девайсе на микроконтроллере с ядром Cortex-M4 (без F) понадобилось сделать цифровой фильтр для сигнала с АЦП. Фигня вопрос! – подумал я – ведь под рукой есть библиотека CMSIS-DSP, в которой присутствует все необходимое для БИХ-фильтров, работающих с числами с фиксированной запятой. Быстренько закинул параметры фильтра в Iowa Hills IIR Filter Designer, пересчитал коэффициенты получившегося фильтра Баттерворта в q31, погонял это вот все на тестовых сигналах – а вот с реальными вышел неприятный конфуз – даже “почти стабильный” сигнал на выходе фильтра непристойно колбасило.

raskolbas

Вверху исходный, нефильтрованный сигнал, внизу – ужас, получавшийся на выходе фильтра.

Признаюсь сразу – я лошара, и первым же делом стоило проверить, что действительно приходит с АЦП – но по опыту использования фильтров из CMSIS-DSP мне казалось, что такой фигни быть не должно. Начал искать проблемы в “железе”, и мог бы зайти по этому пути далеко, пока случайно не отключил один из фильтров (ФВЧ с частотой среза 1 Гц при частоте дискретизации около килогерца). И что бы вы думали? Сигнал волшебным образом пришел в норму!

Оказывается, что фильтры с переменными формата q31 при таких соотношениях между частотой среза и частотой дискретизации численно неустойчивы, и надо использовать q63 – в документации CMSIS-DSP это отражено примерно такими словами:

These filters are particularly useful when implementing filters in which the singularities are close to the unit circle. This is common for low pass or high pass filters with very low cutoff frequencies.

Но что значит “close”, что значит “very low”? Как понять, когда 16- или 32-битных коэффициентов не хватает? К сожалению, я как-то не припомню литературы по всяким там численным методам, где подробно разбирались бы вот такие вопросы, связанные с вычислительной устойчивостью. Может, кто-нибудь что-то подскажет?