Dual Tone Multifrequency

本文介绍了双音多频(DTMF)技术的基本原理及应用。详细解释了当按下电话上的按钮时产生的音调组合,这些音调由两个频率组成,并依据ITU-T Q.23建议书定义。
 

Dual Tone Multifrequency (DTMF)

 

DTMF is the tones heard when pressing a button on a telephone. Those tones are comprised of two tones played together (thus the name "dual tone"), as shown in the table below. These are defined in ITU-T Recommendation Q.23.

 1209Hz1336Hz1477Hz1633Hz
697Hz123A
770Hz456B
852Hz789C
941Hz*0#D

 http://www.techabulary.com/d/dtmf.html

close all; clc; clear; tic; %% 01 参数配置 W = 1280; H = 720; save_folder = "data/project"; mkdir(save_folder); save_file_csv = strcat(save_folder, "/","patterns.csv"); % 用于写入到投影仪 n = 4; % 格雷码位数 % 相移参数 N = 12; % 相移步数 A = 130; B = 90; TW = W / (2 ^ n); TH = H / (2 ^ n); %% 02 生成相移法图像 [~, patterns_phaseshift_X] = m_make_phase_shift_patterns(A, B, TW, N, W, H); [~, temp_Y] = m_make_phase_shift_patterns(A, B, TH, N, H, W); patterns_phaseshift_Y = zeros(N, H, W); for i = 1: N patterns_phaseshift_Y(i, :, :) = squeeze(temp_Y(i, :, :))'; end %% 03 生成格雷码图像:X方向 patterns_graycode_X = m_make_gray_code_patterns(n, W, H); temp_Y = m_make_gray_code_patterns(n, H, W); [num, H, W] = size(patterns_graycode_X); patterns_graycode_Y = zeros(num, H, W); for i = 1: num patterns_graycode_Y(i, :, :) = squeeze(temp_Y(i, :, :))'; end %% 04 写入图像 idx = 0; file = fopen(save_file_csv, "w+"); % 写入相移图案 X for i = 1: N idx = idx + 1; % 写入图片 save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp"); disp("写入文件到:" + save_file_img); img = squeeze(patterns_phaseshift_X(i, :, :)); imwrite(img, save_file_img); % 写入csv文件 img_row = squeeze(img(1, :)) * 255.; for w = 1: W fprintf(file, strcat(int2str(round(img_row(w))), ",")); end fprintf(file, "\n"); end % 写入格雷码程序 X for i = 1: num idx = idx + 1; % 写入图像 save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp"); disp("写入文件到:" + save_file_img); img = squeeze(patterns_graycode_X(i, :, :)); imwrite(img, save_file_img); % 写入图像 img_row = squeeze(img(1, :)); for w = 1: W fprintf(file, strcat(int2str(round(img_row(w))), ",")); end fprintf(file, "\n"); end % 写入相移图案 Y for i = 1: N idx = idx + 1; % 写入图片 save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp"); disp("写入文件到:" + save_file_img); img = squeeze(patterns_phaseshift_Y(i, :, :)); imwrite(img, save_file_img); % 写入csv文件 img_row = squeeze(img(1, :)) * 255.; for w = 1: W fprintf(file, strcat(int2str(round(img_row(w))), ",")); end fprintf(file, "\n"); end % 写入格雷码程序 Y for i = 1: num idx = idx + 1; % 写入图像 save_file_img = strcat(save_folder, "/", int2str(idx), ".bmp"); disp("写入文件到:" + save_file_img); img = squeeze(patterns_graycode_Y(i, :, :)); imwrite(img, save_file_img); % 写入图像 img_row = squeeze(img(1, :)); for w = 1: W fprintf(file, strcat(int2str(round(img_row(w))), ","));close all; clc; clear; tic; %% 01 参数配置 calib_folder = "data/calib"; N = 12; n = 4; num = n + 2; B_min = 10; % 低于这个调制度的我们就认为它的相位信息不可靠 IT = 0.5; % 格雷码阈值 win_size = 7; % 中值滤波窗口大小 W = 1280; H = 720; points_per_row = 7; points_per_col = 6; w = 2; load("data/calib/camera_imagePoints.mat"); [~, ~, calib_num] = size(imagePoints); prjPoints = zeros(size(imagePoints)); %% 02 标定投影仪、相机 for calib_idx = 1: calib_num disp(calib_idx); data_folder = calib_folder + "/" + num2str(calib_idx); %% 02 近似查看图像圆心 img = 255 - imread(data_folder + "/18.bmp"); for i = 1: points_per_row * points_per_col xy = imagePoints(i, :, calib_idx); x = round(xy(1)); y = round(xy(2)); img(y, x) = 255; end figure(); mesh(img); %% 03 解X\Y相位 files_phaseShiftX = cell(1, N); idx = 1; for i = 1: N files_phaseShiftX{i} = strcat(data_folder, "/", int2str(idx), ".bmp"); idx = idx + 1; end files_grayCodeX = cell(1, num); for i = 1: num files_grayCodeX{i} = strcat(data_folder, "/", int2str(idx), ".bmp"); idx = idx + 1; end files_phaseShiftY = cell(1, N); for i = 1: N files_phaseShiftY{i} = strcat(data_folder, "/", int2str(idx), ".bmp"); idx = idx + 1; end files_grayCodeY = cell(1, num); for i = 1: num files_grayCodeY{i} = strcat(data_folder, "/", int2str(idx), ".bmp"); idx = idx + 1; end [phaX, difX] = m_calc_absolute_phase(files_phaseShiftX, files_grayCodeX, IT, B_min, win_size); [phaY, difY] = m_calc_absolute_phase(files_phaseShiftY, files_grayCodeY, IT, B_min, win_size); phaX = phaX * W; phaY = phaY * H; for i = 1: points_per_row * points_per_col xy = imagePoints(i, :, calib_idx); x = xy(1); y = xy(2); x_round = round(x); y_round = round(y); % 对x、y附近对相位进行样条曲线插值 xs = zeros(1, 2 * w + 1); ys = zeros(1, 2 * w + 1); phas_x = zeros(1, 2 * w + 1); phas_y = zeros(1, 2 * w + 1); ii = 1; for j = - 1 * w: w es,'X (mm)'); ylabel(player.Axes,'Y (mm)'); zlabel(player.Axes,'Z (mm)'); view(player,ptCloud); pha_y = spline(ys, phas_y, y); prjPoints(i, :, calib_idx) = [pha_x, pha_y]; end end save(calib_folder + "\projector_imagePoints.mat", 'prjPoints'); toc; end fprintf(file, "\n"); end disp("写入完成"); fclose(file); toc;
最新发布
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值