Теорему Котельникова помните?
Перевожу с русского на русский: в реальном сигнале бесконечно много частотных гармоник.Теорема Котельникова: ...Разумеется, реальные сигналы (например, звук на цифровом носителе) не обладают такими свойствами, так как они конечны по времени и обычно имеют разрывы во временно́й характеристике. Соответственно, ширина их спектра бесконечна.
И их там много не из-за того, что "не бывает источника постоянной частоты", а из-за того, что невозможно измерить сигнал бесконечной длительности.
Не существует способа <<получить информацию "о герце">>.
Спектр сигнала можно выяснять математически, но "напрямую снимать герцы" невозможно.
Проблема выяснения плотности вероятности является фундаментальной проблемой в науке: https://en.wikipedia.org/wiki/Kernel_density_estimation
Если бы был известен способ "напрямую снимать герцы", он непременно появился бы в этой статье.
Вот что получается у меня в эмуляторе.
Исходный вариант.
усреднение_60с_1Гц.png
Ну, ждать несколько минут "выхода на режим у меня терпения нет", поэтому на двух следующих я показываю 10с-усреднение.
Вот генератор "1Гц"
усреднение_10с_1Гц.png
Вот генератор "2Гц"
усреднение_10с_2Гц.png
Зоркий глаз заметит, что "1Гц" при усреднении получается 0.9Гц (см первую и вторую картинку -- там last1m равно 0.9).
Как же так? А всё просто: глючит CoDeSys -- неправильно работают таймеры.
На графиках красные линии идут раз в минуту.
1-ая картинка: за чуть большее чем 5 минут время насчиталось 289 импульсов.
Т.е. реальная частота заведомо меньше, чем -- 289/(5*60) == 0.96. Результат усреднения -- 0.9
2-ая картинка: за 4 минуты 225 импульсов. 225/(4*60) == 0.93Гц максимум. Результат усреднения -- 0.9
3-я картинка: за 4 минуты 404 импульса. 404/(4*60) == 1.68Гц. Результат усреднения -- 1.6.
Во всех случаях показатель last1m сошёлся к "delta". Переменная delta -- это количество импульсов за "последние 10 секунд".
Тут я опираюсь на то, что если указал T#10s в task configuration, то считаю, что задача раз в 10 секунд и будет выполняться.
Возможно, не стоит доверять task configuration'у, а при усреднениях явно получать текущее время.





Ответить с цитированием