打印
[其他]

查表法实现FFT

[复制链接]
楼主: zhuotuzi
手机看帖
扫描二维码
随时随地手机跟帖
61
jimmhu| | 2025-2-17 11:36 | 只看该作者 回帖奖励 |倒序浏览
在构建查找表和进行FFT计算时,要确保数据的格式和类型保持一致。例如,如果查找表中的值是浮点数,那么在进行蝶形运算时,相关的计算也应该使用浮点数运算,以避免数据类型转换带来的精度损失。

使用特权

评论回复
62
LinkMe| | 2025-2-17 12:05 | 只看该作者
列表在一定的复杂程度上可以省钱,

使用特权

评论回复
63
usysm| | 2025-2-17 13:20 | 只看该作者
当将查找表中的值存储为离散的数值时,会引入量化误差。这种误差可能会随着计算的传播而积累,影响最终的结果。因此,需要在构建查找表时选择合适的量化精度,并在计算过程中采取适当的措施来控制误差的传播。

使用特权

评论回复
64
digit0| | 2025-2-18 17:30 | 只看该作者
查表法实现FFT通过预先计算并存储常见的复数乘积结果,在运算时直接查表获取,从而提高运算速度。具体实现包括构建蝶形运算的预先计算表,并在运算时根据输入信号的下标查找对应结果。

使用特权

评论回复
65
chenqianqian| | 2025-2-26 19:23 | 只看该作者
查表法的精度如何呢?能满足要求吗?

使用特权

评论回复
66
suncat0504| | 2025-2-26 22:26 | 只看该作者
硬件资源够的话,查表法也是一个不错的选择。

使用特权

评论回复
67
物联万物互联| | 2025-2-27 07:01 | 只看该作者
查表法虽然应用广泛,但其有效性依赖于特定场景和需求,在某些场景下效果较好,但并非所有情况都适用。

使用特权

评论回复
68
结合国际经验| | 2025-2-27 14:27 | 只看该作者
FFT算法基于分治思想,将大问题分解为小问题。

使用特权

评论回复
69
地瓜patch| | 2025-2-28 12:08 | 只看该作者
这是fft滤波么

使用特权

评论回复
70
gejigeji521| | 2025-2-28 15:08 | 只看该作者
查表法适用于特定点数的FFT计算。

使用特权

评论回复
71
yangjiaxu| | 2025-2-28 15:24 | 只看该作者
好像查表法确实比较方便,就是占用了一些存储空间

使用特权

评论回复
72
单芯多芯| | 2025-2-28 18:35 | 只看该作者
可以通过计算标准FFT算法的结果与查表法实现的FFT结果进行对比,以验证查表法实现的FFT的正确性。

使用特权

评论回复
73
鹿鼎计| | 2025-3-2 23:37 | 只看该作者
检查表不仅提升效率,更能在复杂项目中节约成本

使用特权

评论回复
74
未来AI| | 2025-3-4 21:05 | 只看该作者
查表法能减少计算复杂度,从而节省计算资源,提高效率

使用特权

评论回复
75
zhengshuai888| | 2025-3-6 22:01 | 只看该作者
如果使用查表法计算,会影响运算速度吧。

使用特权

评论回复
76
weifeng90| | 2025-3-7 08:04 | 只看该作者
查表法计算精度和效率会受影响吗

使用特权

评论回复
77
PreWorld| | 2025-3-8 07:12 | 只看该作者
优化代码,减少循环次数和复杂度,使用更高效算法,提高计算速度

使用特权

评论回复
78
andy520520| | 2025-3-9 11:30 | 只看该作者
本帖最后由 andy520520 于 2025-3-9 18:09 编辑

这个FFT计算完全是错误的,不知道是哪里搞的

计算N点的FFT,分为log2(N) 层,旋转因子的表格大小为twiddle_factors_table[N/2]

使用特权

评论回复
79
andy520520| | 2025-3-9 11:38 | 只看该作者
本帖最后由 andy520520 于 2025-3-15 17:45 编辑

上面的FFT计算完全是错误的,不知道是哪里搞的

计算N点的FFT,分为log2(N) 层,每层N/2个蝶形,每个蝶形有一个复数乘法,旋转因子的表格 twiddle_factors_table[N/2]旋转因子表格大小是N/2
stage =  0 , 1 , 2 , ... ,  log2(N)- 1
在第0层,    W_N^0 = 1
在第一层,  W_N^0 = 1,   W_N^(N/2^(stage +1)))
在第二层,  W_N^0 = 1,   W_N^(N/2^(stage + 1)),   W_N^(2 *N/2^(stage + 1)),  W_N^(3 * N/ 2^(stage + 1))

下面给出旋转因子表格

#define SCALE_FACTOR (1 << 14)          //   在乘法的时候再缩回

// 定义复数结构体,元素类型改为

typedef struct
{    long int real;   
     long int imag;
} complex_int;

// 获取旋转因子表
void get_twiddle_factors(int n, complex_int *twiddle_factors)
{   
for (int k = 0; k < n / 2; k++)
{        
     double angle = -2 * M_PI * k / n;        
     double real_part = cos(angle);        
     double imag_part = sin(angle);        
     // 将实部和虚部乘以放大因子并取整        
     twiddle_factors[k].real    = (long int)(real_part   * SCALE_FACTOR);        
     twiddle_factors[k].imag  = (long int)(imag_part * SCALE_FACTOR);   
   }
}

FFT的精髓在下面的公式 ,合并了复数乘法,减少了乘法的次数,基2时间抽取法的FFT,乘法次数是 N/2 * log2(N)  
t = W_N^k * odd[k]

X[k]             =  oven[k]  +   t

X[k + N/2]    =  even[k]  -    t

使用特权

评论回复
80
LinkMe| | 2025-3-9 12:24 | 只看该作者
查表法确实有其局限性,并非万能,只适用于特定场景,需要结合具体情况灵活使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则