C语言实现 IFFT 运算

参考 《C》C语言实现FFT算法_杨贵安的博客-CSDN博客_c语言 fft 实现了 fft 运算;

如果要实现 ifft 运算,只需要在输入和输出时取共轭就好了,故 ifft 的 C 语言实现如下(已经通过matlab 验证)。

// n 为信号长度, n=2^k
// pr 为输入信号实部,pi 为输入信号虚部
// fr 为输出信号实部,fi 为输出信号虚部
// 函数执行后,pr 变为输出信号的模
void ifft(int n, int k,
	long double pr[], long double pi[], long double fr[], long double fi[])
{
   
	int it, m, is, i, j, nv, l0;
	long double p, q, s, vr, vi, poddr, poddi;

	for (i = 0; i < n; i++)	// 取共轭
	{
   
		pi[i] = -pi[i];
	}

	for (it = 0; it <= n - 1; it++)  //将pr[0]和pi[0]循环赋值给fr[]和fi[]
	{
   
		m = it;
		is = 0;
		for (i = 0; i <= k - 1;
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F103上实现IFFT,您需要使用一些库和工具。以下是一些步骤: 1. 安装并配置STMCubeMX和System Workbench for STM32。 2. 在CubeMX中,选择您的微控制器型号,并配置您的时钟和引脚。 3. 添加CMSIS DSP库以进行FFT和IFFT计算。您可以在CubeMX中选择此库并生成代码。 4. 在System Workbench中,创建一个新的工程,并将生成的代码导入其中。 5. 在您的代码中,调用相应的CMSIS DSP库函数以执行IFFT计算。例如,您可以使用arm_rfft_fast_f32()函数将实数FFT转换为复数FFT,然后使用arm_cfft_f32()函数执行FFT计算,最后使用arm_cmplx_mag_f32()函数计算幅值。 下面是一个实现128点IFFT的示例代码: ``` #include "stm32f1xx_hal.h" #include "arm_math.h" #define FFT_SIZE 128 float32_t ifft_input[FFT_SIZE * 2]; float32_t ifft_output[FFT_SIZE * 2]; int main(void) { /* 初始化HAL库 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化FFT输入数据 */ for (int i = 0; i < FFT_SIZE * 2; i += 2) { ifft_input[i] = sinf((float)i / FFT_SIZE * 2 * PI); ifft_input[i + 1] = 0; } /* 执行IFFT计算 */ arm_rfft_fast_f32(&arm_rfft_instance_f32, ifft_input, ifft_output, 0); arm_cfft_f32(&arm_cfft_sR_f32_len128, ifft_output, 1, 1); arm_cmplx_mag_f32(ifft_output, ifft_input, FFT_SIZE); /* 此时ifft_input中存储了IFFT结果 */ while (1) { } } /* 系统时钟配置函数 */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值