DSP_fir_cplx
4.4 Filtering and Convolution
DSP_fir_cplx | Complex FIR Filter | |||
Function |
|
|
| |
| void DSP_fir_cplx (const short * restrict x, const short * restrict h, short * restrict | |||
|
| r, int nh, int nr) |
|
|
Arguments |
| x[2*(nr+nh−1)] | Complex input data. x must point to x[2*(nh−1)]. | |
|
| h[2*nh] | Complex coefficients (in normal order). | |
|
| r[2*nr] | Complex output data. | |
|
| nh | Number of complex coefficients. Must be a multiple of 2. | |
|
| nr | Number of complex output samples. Must be a multiple of 4. | |
Description |
| This function implements the FIR filter for complex input data. The filter has | ||
|
| nr output samples and nh coefficients. Each array consists of an even and odd | ||
|
| term with even terms representing the real part and the odd terms the | ||
|
| imaginary part of the element. The pointer to input array x must point to the | ||
|
| (nh)th complex sample; i.e., element 2*(nh−1), upon entry to the function. The | ||
|
| coefficients are expected in normal order. | ||
Algorithm |
| This is the C equivalent of the assembly code without restrictions. Note that | ||
|
| the assembly code is hand optimized and restrictions may apply. |
void DSP_fir_cplx(short *x, short *h, short *r,short nh, short nr)
{
short i,j;
int imag, real;
for (i = 0; i < 2*nr; i += 2){ imag = 0;
real = 0;
for (j = 0; j < 2*nh; j += 2){
real += h[j] * x[i−j] − h[j+1] * x[i+1−j]; imag += h[j] * x[i+1−j] + h[j+1] * x[i−j];
}
r[i] = (real >> 15); r[i+1] = (imag >> 15);
}
}