1: | | (declare (fixnum)) |
2: | | |
3: | | (define header-size 39984) |
4: | | (define trailer-size 1892352) |
5: | | (define volumes 160) |
6: | | (define slices 15) |
7: | | (define copy-slice? #t) |
8: | | (define rows 64) |
9: | | (define columns 64) |
10: | | (define overscan? #f) |
11: | | (define back-and-forth? #t) |
12: | | |
13: | | ;;(define header (make-vector header-size)) |
14: | | ;;(define trailer (make-vector trailer-size)) |
15: | | |
16: | | (define slice-size (* 2 columns rows)) |
17: | | (define volume-size (* (if copy-slice? (+ slices 1) slices) slice-size)) |
18: | | (define data-size (* volumes volume-size)) |
19: | | |
20: | | (define file-name "P50688.7") |
21: | | (set! file-name file-name) |
22: | | |
23: | | (define (read-data file-name) |
24: | | |
25: | | (let ((data (build-Fixed-array manipulators: generic-array-manipulators |
26: | | domain: (build-Interval '#(0 0 0 0) |
27: | | (vector |
28: | | 160 |
29: | | (if copy-slice? (+ slices 1) slices) |
30: | | 64 |
31: | | 64)))) |
32: | | (port (open-input-file (list path: file-name input-char-encoding: 'latin1 eol-encoding: 'lf)))) |
33: | | |
34: | | (define (read-header) |
35: | .01% | (do ((i 0 (+ i 1))) |
36: | 0% | ((= i header-size)) |
37: | 0% | (read-char port))) |
38: | | |
39: | | (define (read-trailer) |
40: | .39% | (do ((i 0 (+ i 1))) |
41: | .08% | ((= i trailer-size)) |
42: | .13% | (if (eof-object? (read-char port)) |
43: | | (error "crapola2")))) |
44: | | |
45: | | (define (read-volume v) ; the slices are in order 0, 2, 4, ..., 1, 3, ... |
46: | | (let ((accessor (Array-accessor (curry v 1)))) |
47: | 0% | (do ((j 0 (+ j 2))) |
48: | 0% | ((<= slices j)) |
49: | | (read-slice (accessor j) #f)) |
50: | 0% | (do ((j 1 (+ j 2))) |
51: | 0% | ((<= slices j)) |
52: | | (read-slice (accessor j) #t)) |
53: | | (if copy-slice? |
54: | | (let ((accessor (Mutable-array-accessor (accessor (- slices 1)))) |
55: | | (setter (Mutable-array-setter (accessor slices))) |
56: | | (domain (Mutable-array-domain (accessor slices)))) |
57: | 0% | (Interval-for-each (lambda (k l) |
58: | .11% | (setter (accessor k l) k l)) |
59: | | domain))))) |
60: | | |
61: | | (define (read-slice s change-sign?) |
62: | 0% | (let ((accessor (Array-accessor (curry s 1)))) |
63: | .02% | (do ((k 0 (+ k 2))) |
64: | .01% | ((= k rows)) |
65: | .01% | (read-row (accessor k) change-sign?) |
66: | .02% | (read-row-backwards (accessor (+ k 1)) (not change-sign?))))) |
67: | | |
68: | | (define (read-row r change-sign?) |
69: | .01% | (let ((setter (Mutable-array-setter r))) |
70: | .97% | (do ((l 0 (+ l 1))) |
71: | .21% | ((= l columns)) |
72: | .11% | (let ((result (read-complex))) |
73: | .41% | (if change-sign? |
74: | | (begin |
75: | .29% | (Complex-real-set! result (FLOAT (- (Complex-real result)))) |
76: | .3% | (Complex-imag-set! result (FLOAT (- (Complex-imag result)))))) |
77: | .34% | (setter result l))))) |
78: | | |
79: | | (define (read-row-backwards r change-sign?) |
80: | .01% | (let ((setter (Mutable-array-setter r))) |
81: | .96% | (do ((l (- columns 1) (- l 1))) |
82: | .24% | ((< l 0)) |
83: | .11% | (let ((result (read-complex))) |
84: | .42% | (if change-sign? |
85: | | (begin |
86: | .32% | (Complex-real-set! result (FLOAT (- (Complex-real result)))) |
87: | .34% | (Complex-imag-set! result (FLOAT (- (Complex-imag result)))))) |
88: | .37% | (setter result l))))) |
89: | | |
90: | | (define (read-complex) |
91: | 4.23% | (let* ((byte-1 (char->integer (read-char port))) |
92: | .63% | (byte-2 (char->integer (read-char port))) |
93: | .5% | (byte-3 (char->integer (read-char port))) |
94: | .47% | (byte-4 (char->integer (read-char port)))) |
95: | 2.07% | (let ((value-1 (##flonum.<-fixnum (+ (##fixnum.arithmetic-shift-left (if (>= byte-1 128) |
96: | .33% | (- byte-1 256) |
97: | .15% | byte-1) |
98: | .2% | 8) |
99: | .45% | byte-2))) |
100: | 2.% | (value-2 (##flonum.<-fixnum (+ (##fixnum.arithmetic-shift-left (if (>= byte-3 128) |
101: | .33% | (- byte-3 256) |
102: | .15% | byte-3) |
103: | .18% | 8) |
104: | .51% | byte-4)))) |
105: | 1.67% | (make-Complex value-1 value-2)))) |
106: | | |
107: | | (read-header) |
108: | | |
109: | | (Array-for-each read-volume (curry data 1)) |
110: | | |
111: | | (read-trailer) |
112: | | (if (not (eof-object? (read-char port))) |
113: | | (error "crapola")) |
114: | | (close-input-port port) |
115: | | data)) |
116: | | |
117: | | (declare (generic)) |