Переходы входного сигнала через ноль
Лиза П. Хакер разрабатывает систему для обработки сигналов, приходящих от физических сенсоров. Один из важных инструментов, который она хочет построить, — это сигнал, описывающий переходы входного сигнала через ноль (zero crossings). Выходной сигнал должен равняться +1 , когда сигнал на входе меняется с отрицательного на положительный, -1 , когда сигнал меняется с положительного на отрицательный, и 0 в остальных случаях. (Допустим, что знак нулевого входа положителен). Например, типичный входной сигнал и связанный с ним сигнал перехода через ноль могут выглядеть так:
...1 2 1.5 1 0.5 -0.1 -2 -3 -2 -0.5 0.2 3 4 ...
...0 0 0 0 0 -1 0 0 0 0 1 0 0 ...
В Лизиной системе сигнал от сенсора представляется как поток sense-data , а zero-crossings представляет соответствующий поток пересечений нуля. Для начала Лиза пишет процедуру sign-change-detector , которая берет два значения в качестве аргументов и, сравнив их знаки, выдает 0 , 1 или -1 . Затем она строит поток переходов через ноль следующим образом:
(define (make-zero-crossings input-stream last-value)
(cons-stream
(sign-change-detector (stream-car input-stream) last-value)
(make-zero-crossings (stream-cdr input-stream)
(stream-car input-stream))))
(define zero-crossings (make-zero-crossings sense-data 0))
Мимо проходит Лизина начальница Ева Лу Атор и замечает, что программа приблизительно равносильна следующей, написанной с использованием обобщенной версии stream-map из упражнения 3.50 :
(define zero-crossings
(stream-map sign-change-detector sense-data ))
Завершите программу, вставив необходимое <expression> .
There is a bug in tests here. They contradict the description from the book. When signal changes from positive to negative there must be -1, tests require 1. And the same problem for the opposite situation.