第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要求