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);%保存聲音文件
結果