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