This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

CMSIS DSP arm_fir_decimate function usage

I want to decimate a signal with a decimation factor M=4

I used arm_fir_decimate_q15 function for the same but am unable to get correct results.

Following is my code

#include <stdio.h>
#include "arm_math.h"

#define DECIMATOR_BLOCK_SIZE 32
#define DECIMATOR_NO_OF_TAPS_FIR 4
#define DECIMATION_FACTOR 4

int main(void)
{
    arm_fir_decimate_instance_q15 decimate_inst;
    q15_t m_decimator_state[DECIMATOR_NO_OF_TAPS_FIR + DECIMATOR_BLOCK_SIZE - 1];
    const q15_t decimator_coeffs[DECIMATOR_NO_OF_TAPS_FIR] = {0, 0, 0, 1}; // In time reverse order
	
    int16_t src_buff_1[DECIMATOR_BLOCK_SIZE] = {859, -292, 356, -510, -835, -134, 921, -932, 868, -315, -933, 230, -513, -834, -567, 525, -87, 351, 754, 26, -132, 517, -726, -71, -749, 169, 792, -229, -500, -397, 717, 108};
	int16_t src_buff_2[DECIMATOR_BLOCK_SIZE] = {-35, -719, 264, 664, -426, 708, -670, -56, 287, 768, -704, 405, 316, 744, 862, -44, -895, 40, 540, -31, -257, -941, 795, -617, -712, 449, -853, -854, 470, 5, -194, 882};
	volatile int16_t dst_buff[DECIMATOR_BLOCK_SIZE / DECIMATION_FACTOR] = { 0 };

    arm_status ret_status;

	ret_status = arm_fir_decimate_init_q15(&decimate_inst,
										   DECIMATOR_NO_OF_TAPS_FIR,
										   DECIMATION_FACTOR,
										   &decimator_coeffs[0],
										   &m_decimator_state[0],
										   DECIMATOR_BLOCK_SIZE);
	if (ret_status != ARM_MATH_SUCCESS)
	{
		printf("---- arm_fir_decimate_init_q15 failed ----\n");
	}

	arm_fir_decimate_q15(&decimate_inst,
							 (q15_t*)src_buff_1,
							 (q15_t*)dst_buff,
							 DECIMATOR_BLOCK_SIZE);

	return 0;
}

Output

{0, -1, 0, -1, -1, -1, -1, -1}

What could be going wrong?

Parents Reply Children
No data