ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
866888
misyachniy (30.08.2018 11:16, просмотров: 8885)
Пытаюсь спереть фильтр в программе на Cortex M3 Ведет себя как на картинке Вот дизассемблированый кусок MOVGE R0, R1 ; if (GF>=1) R0 = excess_barrier; MOVLT R0, #0 ; else R0 = 0; LDR R1, [R5,#0x48] ; R1=excess_barrier_filtered SUBS R2, R0, R1 ; R2 = excess_barrier - excess_barrier_filtered ADD.W R1, R1, R2,ASR#6 ; R1 = excess_barrier_filtered + (excess_barrier - excess_barrier_filtered )/64 STR R1, [R5,#0x48] ; excess_barrier_filtered "Нарисовал" обычный усредняющий // 6.5 Усредняем превышение excess_barrier_filtered += (excess_barrier-excess_barrier_filtered)/64; Он веде себя не так. Как только размах сигнала меньше 64 - переменная excess_barrier_filtered рисует прямую линию. Логично. Начал отлаживать "вражеский" код под отладчиком. если excess_barrier-excess_barrier_filtered становиться отрицательным, то арифметический сдвиг вправо никогда не дает 0. минимум -1. Что за реализация фильтра?
image