离散傅里叶变换 - 快速计算方法及C实现 - 第三篇

DFT – Fast algorithms and C implementations - Part3


Radix-3 DFT

我在第一篇博客里分析了Radix-2 DFT的计算原理,并据此写出了Radix-2 DFT的代码,并验证了其有效性。现在我们有信心认为,只要有了公式,就能写出正确的程序,产生正确的结果!

下面我们推导一下Radix-3 DFT的公式,其实非常简单:

设N长序列\lbrace x_j \rbrace_{j<N}的DFT为\lbrace X_k \rbrace_{k<N},且N能被3整除,则:

\begin{align} X_k &=\sum_{j<N}{x_jW_N^{jk}} \nonumber \\ &=\sum_{j<N/3}{x_{3j}W_N^{3jk}}+\sum_{j<N/3}{x_{3j+1}W_N^{(3j+1)k}} +\sum_{j<N/3}{x_{3j+2}W_N^{(3j+2)k}}\nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \end{align}

\begin{align} X_{k+N/3} &=\sum_{j<N/3}{x_{3j}W_N^{3j(k+N/3)}}+\sum_{j<N/3}{x_{3j+1}W_N^{(3j+1)(k+N/3)}} +\sum_{j<N/3}{x_{3j+2}W_N^{(3j+2)(k+N/3)}}\nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_3^1W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_3^2 W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \end{align}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSF(Line Spectral Frequencies)是一种表示语音信号的方法,它是由线性预测分析(Linear Predictive Analysis,LPA)求得的。归一化离散傅里叶变换(Normalized Discrete Fourier Transform,NDFT)是一种将时域信号转换为频域信号的方法。在语音信号处理中,基于LSF的NDFT可以用来计算声道频率响应(Spectral Frequency Response,SFR)曲线,用于声学特征提取和语音识别。 下面是一个基于LSF的NDFT计算SFR曲线的C++代码实现: ```c++ #include <iostream> #include <cmath> #define PI 3.14159265358979323846 int main() { const int filtered_lsf_size = 10; // LSF长度 const double filtered_lsf[filtered_lsf_size] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}; // LSF数组 const int sfr_size = 512; // SFR长度 double sfr[sfr_size]; // SFR数组 // 归一化LSF double normalized_lsf[filtered_lsf_size]; for (int i = 0; i < filtered_lsf_size; i++) { normalized_lsf[i] = filtered_lsf[i] * PI; } // NDFT计算SFR for (int i = 0; i < sfr_size; i++) { double omega = i * 2 * PI / sfr_size; double re = 0.0, im = 0.0; for (int j = 0; j < filtered_lsf_size; j++) { re += cos(omega * normalized_lsf[j]); im -= sin(omega * normalized_lsf[j]); } sfr[i] = sqrt(re * re + im * im); } // 输出SFR for (int i = 0; i < sfr_size; i++) { std::cout << sfr[i] << std::endl; } return 0; } ``` 在上面的代码中,首先定义了LSF数组和长度,以及SFR数组和长度。为了归一化LSF,将其每个元素都乘以PI得到normalized_lsf数组。然后,对于每个频率点i,计算其对应的角频率omega,并通过循环计算NDFT中的实部和虚部。最后,将实部和虚部的平方和开方得到SFR曲线的幅度值。 需要注意的是,SFR曲线的长度应当与输入信号的长度相同,通常为512或1024。此外,由于NDFT计算复杂度较高,需要进行优化或使用快速傅里叶变换(Fast Fourier Transform,FFT)算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值