热度 15| ||
一些计算,例如DFT,在计算时需要用到系数。这些系数在公式中是使用cos函数和sin函数计算出来的,每次使用一个系数,都需要进行一次三角函数计算。但是用数字电路实现时,所以通常会采用预先采样出三角函数值存在表格里,通过地址索引的方式完成系数的计算。
以N点DFT为例来分析下如何实现系数的正确计算。为简化分析,仅考虑实部。由于n,k为整数,所以系数的每次步进最小单位为2π/N,根据不同的n,k值得到不同的系数。考虑到三角函数的周期性,可将2π/N *n*k归一化到2π内。
在数字电路实现时,对一个周期内的cos函数值进行sf点的采样得到完整的cos函数值表。
数学公式中cos函数以2π为周期,DFT系数中cos函数的最小步进单位为2π/N;数字电路中cos函数以地址sf为周期,最小步进单位是sf/N。在查找表时根据不同的n,k值就可以得到数学公式中的系数。
以下是matlab验证代码:
clear;
A = 256; f = 1; T = 1; sf = 64;
fs = sf*f; ds = 1/fs; ts = 0:ds:T;
cos_ROM = round(A*cos(2*pi*f*ts));
N = 16; n_max = 16;
% Mathematical formula
for k = 0:N-1
for n = 0:n_max-1
cos_A(k+1,n+1) = round(A*cos(2*pi/N * n*k));
end
end
% Digital
step = sf / N; % 最小步进值
step_k = 0;
for k = 0:N-1
addr = 0;
for n = 0:n_max-1
addr = addr + step_k; % addr = step * n* k;
if(n==0)
addr = 0;
end
addr = mod(addr,sf);
cos_D(k+1,n+1) = cos_ROM(addr+1);
end
step_k = step_k + step;
end