#include void main_upsem(char *in, char *out) { *out = *in; } void read_tape(char *tim_in, char *data_in, char *data_out) { memcpy(data_out, data_in, 1024); } void read_cd(char *tim_in, char *data_in, char *data_out) { memcpy(data_out, data_in, 1024); } void choose(char *sw_in, char *data_in1, char *data_in2, char *data_out) { if (sw_in[0]) { memcpy(data_out, data_in1, 1024); } else { memcpy(data_out, data_in2, 1024); } } /* fir.c - FIR filter in direct form */ /* Usage: y = fir(M, h, w, x); */ /* \(h\) = filter, \(w\) = state, \(x\) = input sample */ /* \(M\) = filter order */ double fir(int M, double *h, double *w, double x) { int i; double y; /* output sample */ w[0] = x; /* read current input sample \(x\) */ for (y=0, i=0; i<=M; i++) y += h[i] * w[i]; /* compute current output sample \(y\) */ for (i=M; i>=1; i--) /* update states for next call */ w[i] = w[i-1]; /* done in reverse order */ return y; } double h_filter[3] = {0.1, 0.2, 0.7}; double w_state[3] = {0, 0, 0}; void amplify_audio(char *data_in, char *data_out) { int i; double *sig_in, *sig_out; /* first amplify */ for (i=0;i<1024;i++) { data_out[i] = data_in[i] << 2; } /* then filter */ sig_in = (double *) data_in; sig_out = (double *) data_out; for (i=0;i<512;i++) { sig_out[i] = fir(3, h_filter, w_state, sig_in[i]); } }