DTMF的matlab實現


1,DTMF原理和產生思路

DTMF即雙音多頻。雙音多頻的撥號鍵盤是4×4的矩陣,每一行代表一個高頻,每一列代表一個低頻。用戶每按一個鍵就發送一個高頻和低頻的正弦信號組合,比如在鍵盤上按“1”鍵,電話機就會發送一個697 Hz和1209 Hz的組合信號給電話交換機。每個按鍵的按鍵音包含着兩個頻率的信號,在生成時即可將兩個頻率的信號進行加和來生成DTMF信號。

2,代碼

fs=8000;%采樣率
tk=0.5;%the time of the key按鍵的聲音持續時間
t=0:1/fs:(tk-1/fs);%時間點
z=zeros(1,4000);%按鍵與按鍵之間空白時間
%--------------------生成每個頻率的信號----------------------
s697=sin(2*pi*697*t);
s770=sin(2*pi*770*t);
s852=sin(2*pi*852*t);
s941=sin(2*pi*941*t);
s1209=sin(2*pi*1209*t);
s1336=sin(2*pi*1336*t);
s1477=sin(2*pi*1477*t);
s1633=sin(2*pi*1633*t);
%---------------------生成每個按鍵的多頻-------------------
p1=s697+s1209;
p2=s697+s1336;
p3=s697+s1477;
pa=s697+s1633;
p4=s770+s1209;
p5=s770+s1336;
p6=s770+s1477;
pb=s770+s1633;
p7=s852+s1209;
p8=s852+s1336;
p9=s852+s1477;
pc=s852+s1633;
pxing=s941+s1209;%星號**
p0=s941+s1336;
pjing=s941+s1477;%#號
pd=s941+s1633;
%------------------生成聲音序列----------------------------
sound=[p1,z,p6,z,p0,z,p1,z,p0,z,p1,z,p9,z,p9,z,p0,z,p4,z,p4,z,];
sound=sound/max(abs(sound));%歸一化聲音序列
figure(1);
plot(sound);
%寫出音頻
audiowrite('my_phone_number_sound_test.wav',sound,8000);

%讀出音頻文件,繪制圖線
[phone_sound,fs]=audioread('my_phone_number_sound_test.wav');
figure(2);
plot(phone_sound);

3,代碼解釋

音頻信號默認的采樣率為8000Hz所以一開始設定采樣率fs=8000Hz

audiowrite用來生成音頻

audioread用來讀取音頻

其他見注釋

4,結果

生成的圖像即為本人學號

5,代碼改進

 這是老師的一種思路實際上是一樣的)

fl=[697 770 852 941];%低頻頻率
fh=[1209 1336 1477];%高頻頻率

Fs=8000;%采樣頻率8kHz
last_time=0.5;%單個按鍵聲音持續時間
compound=[];
numString='16010199044';%要轉換的號碼

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(3);freq_hgh=fh(3);
        otherwise
            error('naive!');
    end
    single=0.25*sin(2*pi*freq_low*[1/Fs:1/Fs:last_time])+...
        0.25*sin(2*pi*freq_hgh*[1/Fs:1/Fs:last_time]);
    single=[single,zeros(1,1000)];
    compound=[compound,single];%將每個按鍵串在一起
    
    sound(compound,Fs);%播放聲音
    
end
plot(compound);
audiowrite('test.wav',compound,Fs);%保存聲音文件

  結果

5,函數用法

audiowrite


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM