This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/examples/dsp/TransformFunction_cfftx4/main.c

126 lines
4.0 KiB
C

//
// Created by lujun on 19-6-28.
//
// This contains SIN_COS , clarke, inv_clarke, park, inv_park and pid
// each one has it's own function.
// All function can be found in main function.
// If you don't want to use it, then comment it.
#include "riscv_common_tables.h"
#include "riscv_const_structs.h"
#include "riscv_math.h"
#include "array.h"
#include <stdint.h>
#include "../common.h"
#include "../HelperFunctions/math_helper.c"
#include "../HelperFunctions/ref_helper.c"
#include <stdio.h>
#define DELTAF32 (0.05f)
#define DELTAQ31 (63)
#define DELTAQ15 (1)
#define DELTAQ7 (1)
int test_flag_error = 0;
uint32_t fftSize = 1024;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
static int DSP_cfft_radix4_f32(void)
{
uint16_t i;
fftSize = 256;
riscv_cfft_radix4_instance_f32 S;
uint8_t ifftFlag = 0, doBitReverse = 1;
riscv_cfft_radix4_init_f32(&S, 256, ifftFlag, doBitReverse);
BENCH_START(riscv_cfft_radix4_f32);
riscv_cfft_radix4_f32(&S, cfft_testinput_f32_50hz_200Hz);
BENCH_END(riscv_cfft_radix4_f32);
ref_cfft_radix4_f32(&S, cfft_testinput_f32_50hz_200Hz_ref);
float32_t resault, resault_ref;
uint32_t index, index_ref;
riscv_max_f32(cfft_testinput_f32_50hz_200Hz, 256, &resault, &index);
riscv_max_f32(cfft_testinput_f32_50hz_200Hz_ref, 256, &resault_ref,
&index_ref);
if (index != index_ref) {
BENCH_ERROR(riscv_cfft_radix4_f32);
printf("expect: %d, actual: %d\n", index_ref, index);
test_flag_error = 1;
}
BENCH_STATUS(riscv_cfft_radix4_f32);
}
static int DSP_cfft_radix4_q15(void)
{
uint16_t i;
fftSize = 256;
riscv_cfft_radix4_instance_q15 S;
uint8_t ifftFlag = 0, doBitReverse = 1;
riscv_cfft_radix4_init_q15(&S, 256, ifftFlag, doBitReverse);
BENCH_START(riscv_cfft_radix4_q15);
riscv_cfft_radix4_q15(&S, cfft_testinput_q15_50hz_200Hz);
BENCH_END(riscv_cfft_radix4_q15);
ref_cfft_radix4_q15(&S, cfft_testinput_q15_50hz_200Hz_ref);
q15_t resault, resault_ref;
uint32_t index, index_ref = 117;
riscv_shift_q15(cfft_testinput_q15_50hz_200Hz, 8,
cfft_testinput_q15_50hz_200Hz, fftSize);
riscv_max_q15(cfft_testinput_q15_50hz_200Hz, 256, &resault, &index);
riscv_shift_q15(cfft_testinput_q15_50hz_200Hz_ref, 8,
cfft_testinput_q15_50hz_200Hz_ref, fftSize);
riscv_max_q15(cfft_testinput_q15_50hz_200Hz_ref, 256, &resault_ref,
&index_ref);
if (index != index_ref) {
BENCH_ERROR(riscv_cfft_radix4_q15);
printf("expect: %d, actual: %d\n", index_ref, index);
test_flag_error = 1;
}
BENCH_STATUS(riscv_cfft_radix4_q15);
}
static int DSP_cfft_radix4_q31(void)
{
uint16_t i;
riscv_float_to_q31(cfft_testinput_f32_50hz_200Hz,
cfft_testinput_q31_50hz_200Hz, 512);
riscv_float_to_q31(cfft_testinput_f32_50hz_200Hz_ref,
cfft_testinput_q31_50hz_200Hz_ref, 512);
fftSize = 256;
riscv_cfft_radix4_instance_q31 S;
uint8_t ifftFlag = 0, doBitReverse = 1;
riscv_cfft_radix4_init_q31(&S, 256, ifftFlag, doBitReverse);
BENCH_START(riscv_cfft_radix4_q31);
riscv_cfft_radix4_q31(&S, cfft_testinput_q31_50hz_200Hz);
BENCH_END(riscv_cfft_radix4_q31);
ref_cfft_radix4_q31(&S, cfft_testinput_q31_50hz_200Hz_ref);
q31_t resault, resault_ref;
uint32_t index, index_ref;
riscv_max_q31(cfft_testinput_q31_50hz_200Hz, 256, &resault, &index);
riscv_max_q31(cfft_testinput_q31_50hz_200Hz_ref, 256, &resault_ref,
&index_ref);
if (index != index_ref) {
BENCH_ERROR(riscv_cfft_radix4_q31);
printf("expect: %d, actual: %d\n", index_ref, index);
test_flag_error = 1;
}
BENCH_STATUS(riscv_cfft_radix4_q31);
}
int main()
{
BENCH_INIT;
DSP_cfft_radix4_f32();
DSP_cfft_radix4_q15();
DSP_cfft_radix4_q31();
BENCH_FINISH;
if (test_flag_error) {
printf("test error apprears, please recheck.\n");
return 1;
} else {
printf("all test are passed. Well done!\n");
}
return 0;
}