// file: clpc_cal_6.cc // // this function computes the lp coefficients of a signal // // system include file // #include #include // local include file // #include "global_constants.h" #include "calculate_lpc_constants.h" #include "calculate_lpc.h" // function: calculate_lp_cc // // arguments: // float**& lp_signal_a: (output) buffer contains the dft of the signal // float*& lp_gain_a: (output) predictor gain // float* signal_window_a: (input) buffer of signal // int samples_per_win_a: (input) number of samples per window // int num_chans_a: (input) number of channels // int lp_order_a: (input) type of window // int debug_mode_a: (input) debug level // // return: an int to indicate status // // this function calculates the lpc of a signal using the equation below: // // int calculate_lp_cc (float**& lp_spect_coeffs_a, float*& lp_gain_a, float* signal_window_a, int samples_per_win_a, int num_chans_a, int lp_order_a, int debug_mode_a) { float** autocorr_coeffs = new float*[num_chans_a]; float** lp_pred_coeffs = new float*[num_chans_a]; for (int chan = 0; chan < num_chans_a; chan++) { autocorr_coeffs[chan] = new float[lp_order_a + 1]; memset(autocorr_coeffs[chan], 0, sizeof(float) * (lp_order_a + 1)); lp_pred_coeffs[chan] = new float[lp_order_a + 1]; memset(lp_pred_coeffs[chan], 0, sizeof(float) * (lp_order_a + 1)); } // calculate the autocorrelation coefficients // calculate_autocorr_cc(autocorr_coeffs, signal_window_a, samples_per_win_a, num_chans_a, lp_order_a, debug_mode_a); // initialize variables for the predictor coefficients and the gain // memset(lp_gain_a, 1, sizeof(float) * num_chans_a); // compute the lp predictor coefficients // calculate_pred_coeff_cc(lp_pred_coeffs, lp_gain_a, autocorr_coeffs, num_chans_a, lp_order_a, debug_mode_a); // compute the spectrum of the lp signal // calculate_spect_cc(lp_spect_coeffs_a, lp_pred_coeffs, lp_gain_a, samples_per_win_a, num_chans_a, lp_order_a, debug_mode_a); if (debug_mode_a > DEBUG_FULL) { for (int chan = 0; chan < num_chans_a; chan++) { for (int sample = 0; sample < samples_per_win_a; sample++) { fprintf(stdout, "chan %d :: lp signal [%d] = %.6f\n", chan, sample, lp_spect_coeffs_a[chan][sample]); } } fprintf(stdout, "\n"); } // delete scratch space // if (autocorr_coeffs != (float**)NULL) { for (int chan = 0; chan < num_chans_a; chan++) { if (autocorr_coeffs[chan] != (float*)NULL) { delete [] autocorr_coeffs[chan]; autocorr_coeffs[chan] = (float*)NULL; } } delete [] autocorr_coeffs; autocorr_coeffs = (float**)NULL; } if (lp_pred_coeffs != (float**)NULL) { for (int chan = 0; chan < num_chans_a; chan++) { if (lp_pred_coeffs[chan] != (float*)NULL) { delete [] lp_pred_coeffs[chan]; lp_pred_coeffs[chan] = (float*)NULL; } } delete [] lp_pred_coeffs; lp_pred_coeffs = (float**)NULL; } // exit gracefully // return TRUE; }