理系学生日記

おまえはいつまで学生気分なのか

問題 3-75 (3.5.3 Exploiting the Stream Paradigm)

問題 3.74 の回答は,センサの出力値がウンコだからだめらしい.

Unfortunately, Alyssa's zero-crossing detector in exercise 3.74 proves to be insufficient, because the noisy signal from the sensor leads to spurious zero crossings.

だから次のような改善策が考えられました.

  • 時刻 t の出力値と時刻 t-1 の出力値を平均する
  • 平均値を出力値とみなした上で 0 を挟んだ出力値の遷移が行われたかを判別する

Louis Reasoner は次のようなプログラムでそのアイディアを実装したんですが,まちがっている.間違いを見つけて正せという話になりました.

(define (make-zero-crossings input-stream last-value)
  (let ((avpt (/ (+ (stream-car input-stream) last-value) 2)))
    (cons-stream (sign-change-detector avpt last-value)
                 (make-zero-crossings (stream-cdr input-stream)
                                      avpt))))

問題は last-value が平均値になっていること.avpt は "時刻 t の出力値と時刻 t-1 の出力値を平均" した値になるはずなのですが,make-zero-crossings の引数には "時刻 t-1 の出力値" がないために,これを実現できていません.

Hint: You will need to increase the number of arguments to make-zero-crossings

とあるように,新たな引数としてこの "時刻 t-1 の出力値" を付け加えて上記関数を書き直すとこんな感じになるんじゃないでしょうか.

(define (make-zero-crossings input-stream last-value last-avgt)
  (let ((avpt (/ (+ (stream-car input-stream) last-value) 2)))
    (cons-stream (sign-change-detector avpt last-avpt)
                 (make-zero-crossings (stream-cdr input-stream)
                                      (stream-car input-stream)
                                      avpt))))