/*SINECMOD.C - REAL-TIME SINE MODULATION FOR AM*/ /*modified by 3 amigos Xuan Kong, Mike Ruane, Mike Hoffman*/ /*during 1998 NSF DSP Workshop*/ #include "aiccomc.c" /*AIC comm routines */ #include "math.h" /*math library function */ #define sample_freq 10000 /*sample frequency */ #define sine_freq 1000 /* carrier frequency */ #define mod_freq 300 /* modulation frequency */ #define mod_index 5.0 /* mod index in percent*/ #define pi 3.14159265 /*constant pi */ int AICSEC[4] = {0x162C,0x1,0x3872,0x67}; /*AIC config data*/ void sinemod(float A, float B, float C, float Amod, float Bmod, float Cmod) { float m[3] = {0.0,0.0,0.0}; float y[3] = {0.0,0.0,0.0}; /*y[n] array */ float x[3] = {0.0,0.0,1.0}; /*x[n] array */ int n = 2, result; /*declare variables */ while(1) { TWAIT; m[n] = Amod*m[n-1] +Bmod*m[n-2] + Cmod*x[n-1]; y[n] = A*y[n-1] + B*y[n-2] + C*x[n-1]; /*determine y[n]*/ result = (int)(y[n]*(1.0+(mod_index*0.01)*m[n])*10000.0); PBASE[0x48] = result << 2; /*output to AIC */ m[n-2] = m[n-1]; m[n-1] = m[n]; y[n-2] = y[n-1]; /*shift y's back in array */ y[n-1] = y[n]; x[n-2] = x[n-1]; /*shift x's back in array */ x[n-1] = x[n]; x[n] = 0.0; /*set future x's to 0 */ } } main() { float Fs, Fosc,Fmod, w, wmod, T, A, B, C, Amod, Bmod, Cmod; /*declare variables */ AICSET(); /*initialize AIC */ Fs = sample_freq; /*get sampling frequency */ Fosc = sine_freq; /*get oscillator frequency*/ Fmod = mod_freq; T = 1/Fs; /*determine sample period */ w = 2*pi*Fosc; /*determine angular freq */ wmod = 2*pi*Fmod; A = 2 * cos((w * T)); /*determine coefficient A */ B = -1.0; /*coeff B is constant */ C = sin((w * T)); /*determine coefficient B */ Amod =2*cos((wmod*T)); Bmod = -1.0; Cmod = sin((wmod*T)); sinemod(A, B, C, Amod, Bmod, Cmod); /*call sinewave function */ }