VB如何软解码DDS

VB6或者VB.net软解码DDS(主要是DXT5和DXT1)的方法

第1个回答  2013-07-09
先贴上 matlab算法分析代码,C代码随后就到。

clear;
f = [697,770,852,941,1209,1336,1477,1633]; % DTMF 信号频率表
t_cpu = 1/8e6; % cup周期
pwm_n = 512; % PWM点数
t_dds = t_cpu*pwm_n; % DDS时钟周期
tab_n = 32; % 正弦表点数
step = tab_n * f * t_dds; % 理论DDS地址累加器步长
step_float_bits = 8; % DDS地址累加器步长的小数位长度
step_p = fix(step * 2^step_float_bits) / 2^step_float_bits; %实际DDS地址累加器步长
f0 = 1./(tab_n./step_p .* t_dds); % 实际产生信号的频率
err_f = abs(f0-f)./f*100; % 实际产生信号的频率与理论频率误差百分比(不含数字离散导致)
max_err_f = max(err_f)

t = linspace(0,2*pi,tab_n+1);
t = t(1:tab_n);
sin_tab = fix(sin(t) * pwm_n)/pwm_n;
n = 1:60e-3/t_dds; % 60毫秒

for a = 1:8;
addr(a,:) = mod(fix(step_p(a) .* n),tab_n)+1; % sin表 地址
s(a,:) = sin_tab(addr(a,:)); % 60毫秒的时域信号
end

my_fft(1/t_dds,s(1,:)+s(5,:),1) % 频谱分析 看效果

1

(上图中横坐标单位应该是“Hz”)
从图中可以看出,合成后的两个频谱,离他们最近的杂散(-108dBm)差30dBm,满足DTMF要求