00001
00048 #include "dsp_process.h"
00049 #include "dsp.h"
00050 #include "tpa6130.h"
00051 #include "abdac.h"
00052 #include "audio.h"
00053 #include "conf_demo.h"
00054
00055 bool signals_are_updated;
00056 struct signal_source signal1_generator;
00057 struct signal_source signal2_generator;
00058
00059 A_ALIGNED dsp16_t signal1_buf[BUFFER_LENGTH];
00060 A_ALIGNED dsp16_t signal2_buf[BUFFER_LENGTH];
00061
00062 A_ALIGNED dsp16_t signal_pre_filter_buf[FIR_NUM_COEF + BUFFER_LENGTH];
00063 dsp16_t *signal_in_buf;
00064 A_ALIGNED dsp16_t signal_out_buf[BUFFER_LENGTH + 4];
00065
00066 A_ALIGNED dsp16_t signal_in_fft[BUFFER_LENGTH];
00067 A_ALIGNED dsp16_t signal_out_fft[BUFFER_LENGTH];
00068
00069 dsp16_t stereo_out_buf1[BUFFER_LENGTH * 2];
00070 dsp16_t stereo_out_buf2[BUFFER_LENGTH * 2];
00071 dsp16_t *current_stereo_out_buf;
00072
00073 void dac_overrun_callback(void);
00074 void dac_reload_callback(void);
00075
00076 static dsp16_t fft_window[BUFFER_LENGTH];
00077
00078 unsigned int active_filter;
00079
00080 const char * filter_description[NUM_FILTERS] = {
00081 "No filtering",
00082 "High-pass filter,\n1000Hz cut-off",
00083 "Low-pass filter,\n1000Hz cut-off",
00084 };
00085
00086 A_ALIGNED dsp16_t filter_coef[NUM_FILTERS - 1][FIR_NUM_COEF] = {
00087 {
00088 DSP16_Q(-0.0184183),
00089 DSP16_Q(-0.0207874),
00090 DSP16_Q(-0.0231255),
00091 DSP16_Q(-0.0254103),
00092 DSP16_Q(-0.0276199),
00093 DSP16_Q(-0.0297327),
00094 DSP16_Q(-0.0317281),
00095 DSP16_Q(-0.0335863),
00096 DSP16_Q(-0.0352887),
00097 DSP16_Q(-0.0368182),
00098 DSP16_Q(-0.0381593),
00099 DSP16_Q(-0.0392986),
00100 DSP16_Q(-0.0402242),
00101 DSP16_Q(-0.0409269),
00102 DSP16_Q(-0.0413995),
00103 DSP16_Q(0.9583631),
00104 DSP16_Q(-0.0416369),
00105 DSP16_Q(-0.0413995),
00106 DSP16_Q(-0.0409269),
00107 DSP16_Q(-0.0402242),
00108 DSP16_Q(-0.0392986),
00109 DSP16_Q(-0.0381593),
00110 DSP16_Q(-0.0368182),
00111 DSP16_Q(-0.0352887),
00112 DSP16_Q(-0.0335863),
00113 DSP16_Q(-0.0317281),
00114 DSP16_Q(-0.0297327),
00115 DSP16_Q(-0.0276199),
00116 DSP16_Q(-0.0254103),
00117 DSP16_Q(-0.0231255),
00118 DSP16_Q(-0.0207874),
00119 DSP16_Q(-0.0184183),
00120 }, {
00121 DSP16_Q(0.0184183),
00122 DSP16_Q(0.0207874),
00123 DSP16_Q(0.0231255),
00124 DSP16_Q(0.0254103),
00125 DSP16_Q(0.0276199),
00126 DSP16_Q(0.0297327),
00127 DSP16_Q(0.0317281),
00128 DSP16_Q(0.0335863),
00129 DSP16_Q(0.0352887),
00130 DSP16_Q(0.0368182),
00131 DSP16_Q(0.0381593),
00132 DSP16_Q(0.0392986),
00133 DSP16_Q(0.0402242),
00134 DSP16_Q(0.0409269),
00135 DSP16_Q(0.0413995),
00136 DSP16_Q(0.0416369),
00137 DSP16_Q(0.0416369),
00138 DSP16_Q(0.0413995),
00139 DSP16_Q(0.0409269),
00140 DSP16_Q(0.0402242),
00141 DSP16_Q(0.0392986),
00142 DSP16_Q(0.0381593),
00143 DSP16_Q(0.0368182),
00144 DSP16_Q(0.0352887),
00145 DSP16_Q(0.0335863),
00146 DSP16_Q(0.0317281),
00147 DSP16_Q(0.0297327),
00148 DSP16_Q(0.0276199),
00149 DSP16_Q(0.0254103),
00150 DSP16_Q(0.0231255),
00151 DSP16_Q(0.0207874),
00152 DSP16_Q(0.0184183),
00153 }
00154 };
00155
00156 void signal_source_set_freq(struct signal_source *source,
00157 unsigned int frequency)
00158 {
00159 source->frequency = frequency;
00160 }
00161
00162 unsigned int signal_source_get_freq(struct signal_source *source)
00163 {
00164 return source->frequency;
00165 }
00166
00167 void signal_source_set_volume(struct signal_source *source,
00168 dsp16_t volume)
00169 {
00170 if (volume < 0)
00171 volume = 0;
00172 source->volume = volume;
00173 }
00174
00175 dsp16_t signal_source_get_volume(struct signal_source *source)
00176 {
00177 return source->volume;
00178 }
00179
00180 void signal_source_restore_defaults(struct signal_source *source)
00181 {
00182 source->volume = source->default_volume;
00183 source->frequency = source->default_freq;
00184 }
00185
00186 void signal_source_init(struct signal_source *source,
00187 unsigned int frequency, dsp16_t volume)
00188 {
00189 if (volume < 0)
00190 volume = 0;
00191
00192 source->default_volume = volume;
00193 source->default_freq = frequency;
00194
00195 signal_source_restore_defaults(source);
00196 }
00197
00198 void generate_signal(dsp16_t *signal, struct signal_source *source)
00199 {
00200 source->phase = dsp16_gen_sin(signal, BUFFER_LENGTH,
00201 source->frequency, DAC_SAMPLING_RATE, source->phase);
00202 dsp16_vect_realmul(signal, signal, BUFFER_LENGTH, source->volume);
00203 }
00204
00205 void filter_set_active(unsigned int num)
00206 {
00207 if (num >= NUM_FILTERS)
00208 active_filter = 0;
00209
00210 active_filter = num;
00211 }
00212
00213 void filter_restore_default()
00214 {
00215 active_filter = 0;
00216 }
00217
00218 const char * filter_get_description(unsigned int num)
00219 {
00220 if (num >= NUM_FILTERS)
00221 return "";
00222
00223 return filter_description[num];
00224 }
00225
00226 const char * filter_active_get_description()
00227 {
00228 return filter_get_description(active_filter);
00229 }
00230
00231 void audio_callback(U32 arg)
00232 {
00233 if( arg == AUDIO_DAC_OUT_OF_SAMPLE_CB )
00234 {
00235 dac_overrun_callback();
00236 }
00237
00238 else if( arg == AUDIO_DAC_RELOAD_CB )
00239 {
00240 dac_reload_callback();
00241 }
00242
00243 else if( arg == AUDIO_ADC_OUT_OF_SAMPLE_CB )
00244 {
00245 }
00246
00247 else if( arg == AUDIO_ADC_RELOAD_CB )
00248 {
00249 }
00250 }
00251
00252 void dac_reload_callback(void)
00253 {
00254 int i;
00255
00256 if (current_stereo_out_buf == stereo_out_buf1)
00257 current_stereo_out_buf = stereo_out_buf2;
00258 else
00259 current_stereo_out_buf = stereo_out_buf1;
00260
00261 generate_signal(signal1_buf, &signal1_generator);
00262 generate_signal(signal2_buf, &signal2_generator);
00263
00264
00265
00266 for (i = 0; i < FIR_NUM_COEF; i++) {
00267 signal_pre_filter_buf[i] =
00268 signal_pre_filter_buf[BUFFER_LENGTH + i];
00269 }
00270
00271
00272
00273 dsp16_vect_add_and_sat(signal_in_buf, signal1_buf, signal2_buf,
00274 BUFFER_LENGTH);
00275
00276
00277
00278 if (active_filter > 0) {
00279 dsp16_filt_fir(signal_out_buf, signal_pre_filter_buf,
00280 BUFFER_LENGTH + FIR_NUM_COEF - 1,
00281 filter_coef[active_filter - 1], FIR_NUM_COEF);
00282 } else {
00283 for (i = 0; i < BUFFER_LENGTH; i++)
00284 signal_out_buf[i] = signal_in_buf[i];
00285 }
00286
00287 for (i = 0; i < BUFFER_LENGTH; i++) {
00288 current_stereo_out_buf[i*2] = signal_out_buf[i];
00289 current_stereo_out_buf[i*2+1] = signal_out_buf[i];
00290 }
00291
00292 signals_are_updated = 1;
00293
00294
00295 tpa6130_dac_output(current_stereo_out_buf, BUFFER_LENGTH);
00296 }
00297
00298 void dac_overrun_callback(void)
00299 {
00300
00301 }
00302
00303 void dsp_process_init(int cpu_hz, int hsb_hz, int pba_hz, int pbb_hz)
00304 {
00305
00306 tpa6130_init();
00307
00308
00309 tpa6130_dac_start(DAC_SAMPLING_RATE, DAC_NUM_CHANNELS,
00310 DAC_BITS_PER_SAMPLE, DAC_SWAP_CHANNELS,
00311 audio_callback, AUDIO_DAC_RELOAD_CB,
00312 FOSC0);
00313
00314 tpa6130_set_volume(0x20);
00315 tpa6130_get_volume();
00316
00317 signal_source_init(&signal1_generator, 433, 20000);
00318 signal_source_init(&signal2_generator, 2000, 10000);
00319
00320 current_stereo_out_buf = stereo_out_buf1;
00321 signal_in_buf = signal_pre_filter_buf + FIR_NUM_COEF;
00322 filter_restore_default();
00323
00324 dsp16_win_hamm(fft_window, BUFFER_LENGTH);
00325
00326
00327 dac_reload_callback();
00328 }
00329
00330 static void dsp_calculate_fft(dsp16_t *fft, dsp16_t *signal)
00331 {
00332 int i;
00333 dsp16_t max_value;
00334 dsp16_t temp[BUFFER_LENGTH];
00335 dsp16_complex_t temp_res[BUFFER_LENGTH];
00336
00337 dsp16_vect_dotmul(temp, signal, fft_window, BUFFER_LENGTH);
00338 dsp16_trans_realcomplexfft(temp_res, temp, BUFFER_LENGTH_LOG);
00339 dsp16_vect_complex_abs(fft, temp_res, BUFFER_LENGTH);
00340
00341 for (i = 0; i < FFT_LENGTH; i++)
00342 fft[i] += fft[BUFFER_LENGTH - i - 1];
00343
00344 max_value = dsp16_vect_max(fft, FFT_LENGTH);
00345 dsp16_vect_realdiv(fft, fft, FFT_LENGTH, max_value + 1);
00346 }
00347
00348 void dsp_process_task(void)
00349 {
00350 dsp_calculate_fft(signal_in_fft, signal_in_buf);
00351 dsp_calculate_fft(signal_out_fft, signal_out_buf);
00352 }