⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ft_sr_1.cc

📁 这是处理语音信号的程序
💻 CC
字号:
// file: $PDSP/class/fourier_transform/v3.0/ft_sr_1.cc// // isip include files//#include "fourier_transform.h"#include "fourier_transform_constants.h"// method: sr_complex_cc//// this code is based on the code by G.A.Sitton of the Rice University.// the theory behind the implementation closely follows the description of the// split-radix algorithm in://// J.G.Proakis, D.G.Manolakis, "Digital Signal Processing - Principles,// Algorithms, and Applications" 2nd Edition, Macmillan Publishing Company,// New York, pp. 727-730, 1992.// // arguments:// float_8* output_a :(output) output data array //                      length of output array will always be 2*N//                      memory is allocated internally, not by the calling//                      program.// float_8* input_a : (input) input data array//                      length of input array is 2*N//                      memory is allocated by the calling//                      program.//// return : logical_1 indicating status of computation//// this method computes the fourier transform using the split-radix// algorithm //logical_1 Fourier_transform::sr_complex_cc(float_8* output_a,						    float_8* input_a) {  // declare local variables  //  int_4	i, j, k, m, q, ii, i0, i1, i2, i3, is, id, temp;  float_8 cc1, ss1, cc3, ss3, r1, r2, r3, s1, s2, t;  int_4 n1, n2, n4;    // initialize lookup tables and temporary memory  //  if (sr_init_cc(N_d) == ISIP_FALSE) {    error_handler_cc((char_1*)"sr_real_cc",		     (char_1*)"error generating the lookup table");    return ISIP_FALSE;  }  // check if inout data is a power of 2  //  if (is_power_cc((int_4&)m, (int_4)2) == ISIP_FALSE) {    error_handler_cc((char_1*)"sr_real_cc",		     (char_1*)"order must be a power of 2");    return ISIP_FALSE;  }    // copy input real data to temporary memory and input imaginary data  // into output so that the input data is retained  // after calculations.  //  for (k = 0; k < N_d; ++k) {    sr_temp_d[k] = input_a[k*2];    output_a[k] = input_a[k*2+1];  }    // bit reversal routine  //  n1 = N_d - 1;  n2 = N_d >> 1;  for (i = j = 0; i < n1; ++i, j += k) {    if (i < j) {      t = sr_temp_d[j];      sr_temp_d[j] = sr_temp_d[i];      sr_temp_d[i] = t;      t = output_a[j];      output_a[j] = output_a[i];      output_a[i] = t;    }    k = n2;    while (k <= j) {      j -= k;      k = k >> 1;    }   }    // Length two butterflies	  //  is = 0;  id = 1;  n1 = N_d - 1;    do {    id = id << 2;          for (i0 = is; i0 < N_d; i0 += id) {      i1 = i0 + 1;            r1 = sr_temp_d[i0];      sr_temp_d[i0] = r1 + sr_temp_d[i1];      sr_temp_d[i1] = r1 - sr_temp_d[i1];	      r1 = output_a[i0];      output_a[i0] = r1 + output_a[i1];      output_a[i1] = r1 - output_a[i1];       }    temp = id - 1;    is = temp << 1;  } while (is < n1);    // L shaped butterflies	  //  n2 = 2;  for (k = 2; k <= m; ++k) {    temp = n2;    n4 = temp >> 1;    n2 = n2 << 1;    is = 0;    temp = n2;    id = temp << 1;    // Unity twiddle factor loops	    //    do {      for (i0 = is; i0 < n1; i0 += id) {	i1 = i0 + n4;	i2 = i1 + n4;	i3 = i2 + n4;		r3 = sr_temp_d[i2] + sr_temp_d[i3];	r2 = sr_temp_d[i2] - sr_temp_d[i3];	r1 = output_a[i2] + output_a[i3];	s2 = output_a[i2] - output_a[i3];		sr_temp_d[i2] = sr_temp_d[i0] - r3;	sr_temp_d[i0] = sr_temp_d[i0] + r3;	sr_temp_d[i3] = sr_temp_d[i1] - s2;	sr_temp_d[i1] = s2 + sr_temp_d[i1];		output_a[i2] = output_a[i0] - r1;	output_a[i0] = output_a[i0] + r1;	output_a[i3] = output_a[i1] + r2;	output_a[i1] = output_a[i1] - r2;	      }       is = (id << 1) - n2;      id = id << 2;           } while (is < n1);        q = ii = (int_4)(N_d / (float_8)n2);        // Non-trivial twiddle factor loops	    //    for (j = 1; j < n4; ++j, q += ii) {      cc1 = sr_wr_d[q];      ss1 = sr_wi_d[q];      i3 = q * 3;      cc3 = sr_wr_d[i3];      ss3 = sr_wi_d[i3];            is = j;      id = n2 << 1;            do {	for (i0 = is; i0 < n1; i0 += id) {	  i1 = i0 + n4;	  i2 = i1 + n4;	  i3 = i2 + n4;	     	  r1 = (sr_temp_d[i2] * cc1) + (output_a[i2] * ss1);	  s1 = (output_a[i2] * cc1) - (sr_temp_d[i2] * ss1);	  r2 = (sr_temp_d[i3] * cc3) + (output_a[i3] * ss3);	  s2 = (output_a[i3] * cc3) - (sr_temp_d[i3] * ss3);	  	  r3 = r1 + r2;	  r2 = r1 - r2;	  r1 = s1 + s2;	  s2 = s1 - s2;	  	  sr_temp_d[i2] = sr_temp_d[i0] - r3;	  sr_temp_d[i0] = r3 + sr_temp_d[i0];	  sr_temp_d[i3] = sr_temp_d[i1] - s2;	  sr_temp_d[i1] = s2 + sr_temp_d[i1];	  	  output_a[i2] = output_a[i0] - r1;	  output_a[i0] = r1 + output_a[i0];	  output_a[i3] = output_a[i1] + r2;	  output_a[i1] = output_a[i1] - r2;	}	is = (id << 1) - n2 + j;	id = id << 2;      } while (is < n1);    }  }    // interlace the output and store in the output_a array  //  for (k = N_d - 1; k >= 0; --k) {    output_a[k*2+1] = output_a[k];    output_a[k*2] = sr_temp_d[k];      }  // exit gracefully  //  return ISIP_TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -