按键拨号声音 DTMF MATLAB程序样例

DTMF(Dual tone MultiFrequency)

一、文献简介

[1]介绍了DTMF由Bell实验室发明,实现电话系统自动长途呼叫,用以代替机械拨号转盘按键。

[2]补充介绍了DTMF matlab实现方式

[3]中给出了信号模拟生成的方式代码

[4]中介绍了音频格式以及基本声学概念:(采样值)、(采样(频)率)、(取样率或比特率或位速)、(位深)、(声道,如mono或stereo)

[5]中视频演示了AU对声音信号FFT处理

[6]种介绍了一中电话拨号系统的GUI样式

二、程序样例

1.下面的程序对应于当按键为1时(对应于fr(1)和fc(1))的情况

fr=[697 770 852 941];%fre_row
fc=[1209 1336 1447];%fre_column
Fs=32768;%sample frequency,但是一般选取8k
t=0:1/Fs:0.25;
y1=sin(2*pi*fr(1)*t);
y2=sin(2*pi*fc(1)*t);
y=(y1+y2)/2;
plot(t,y);
sound(y,Fs);

2.下面的程序对应于按下按键“123456789”的情况【本代码可直接复制到MATLAB命令行测试,可听到清脆的“拨号声”】

%DTMF code
clc;
clear;
fl=[697 770 852 941];%fre_row/low fre
fh=[1209 1336 1447];%fre_column/high fre
Fs=8000;%sample frequency,一般选取8k
lasttime=0.25;%单音持续时间
numstring='123456789';
ratio=3;%调整两次拨号之间的间隔
compound=[];%最终的模拟出的信号,是一个行向量
t=1/Fs:1/Fs:lasttime;%单音的时间长度,这里单音长度为0.25s
for i=1:length(numstring)
    switch numstring(i)
        case'1'
            freq_low=fl(1);freq_hgh=fh(1);
        case'2'
            freq_low=fl(1);freq_hgh=fh(2);
        case'3'
            freq_low=fl(1);freq_hgh=fh(3);
        case'4'
            freq_low=fl(2);freq_hgh=fh(1);
        case'5'
            freq_low=fl(2);freq_hgh=fh(2);
        case'6'
            freq_low=fl(2);freq_hgh=fh(3);
        case'7'
            freq_low=fl(3);freq_hgh=fh(1);
        case'8'
            freq_low=fl(3);freq_hgh=fh(2);
        case'9'
            freq_low=fl(3);freq_hgh=fh(3);
        case'0'
            freq_low=fl(4);freq_hgh=fh(2);
        case'*'
            freq_low=fl(4);freq_hgh=fh(1);
        case'#'
            freq_low=fl(4);freq_hgh=fh(3);
        otherwise
            error('error occurred!');
    end
    y1=sin(2*pi*freq_low*t);
    y2=sin(2*pi*freq_hgh*t);
    y=(y1+y2)/2;
    single=[y,zeros(1,Fs*lasttime*ratio)];%相邻两个单音之间补零,模拟按键后的停顿
    compound=[compound,single];
end
sound(compound,Fs);%按键的声音播放
%画图
n=length(compound);
t1=1:n;%图形横轴单位划归为秒
subplot(1,2,1);
plot(t1/Fs,compound);
title('电话按键时域图形');
axis([0 length(numstring) -2 2]);
xlabel('时间/s');
ylabel('幅值')
% audiowrite('test.wav',compound,Fs);%可选保存声音文件
subplot(1,2,2);
p=abs(fft(compound));%快速傅里叶变换
plot(t1*Fs/n,p);
title('电话按键频域图形');
xlabel('频率/Hz');
ylabel('幅值/dB')

3.双音信号的频谱分析代码(这里选取了直流\50Hz\75Hz成分的混合)

%双音信号的频谱 fft
Fs=256;%采样频率
N=256;%采样点数
Ts=1/Fs;%采样周期
n=0:1:N-1;
t=n*Ts;%采样步长
y=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
Y1=y;
subplot(2,1,1);
plot(t,Y1);
f=n*Fs/(N) ;%真实的频率
Y2=fft(y)/N*2;%真实的幅值
subplot(2,1,2);
plot(f,abs(Y2));
xlabel('频率/Hz');
ylabel('振幅');title('fft');grid on;

 

 

 Fig.test.wav声音波形在AU中的展现       

这里选取的是时间在【2.070s,2.100s】之间的波形,横轴代表时间,单位是s,纵轴代表20lg(采样值),单位是dB。特别注意纵轴,又上到下分别0dBz到负无穷再到0dB,坐标轴这样刻画的目的在于满足当采样值为负数下的表达式成立。

波形时间长度:9s,采样(频)率:8KHz,声道:mono,位深:16bit.

根据上述信息计算文件大小:

位速:8K*16bit=128Kbps=16KBps,文件大小:16KBps*9s=144KB.

综上,matlab中生成的声音数据大小为144KB.

link:

[1] DTMF百度百科

[2]《matlab 数值计算》-Cleve.B.Moler-第8章 傅里叶分析-8.1 按键式拨号盘

[3] 代码参考

[4] wav文件格式讲解

[5] B站:用AU通过按键声判断号码

[6] CSDN:一种电话拨号音频系统构建

  • 12
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值