電話撥號音的識別——MATLAB之旅-A01-20150416


    技術博客對於程序員來說,是很重要的。《暗時間》的作者劉未鵬,大二就開始寫技術博客,最后其博客訪問量超過了百萬。寫技術博客好處眾多,有兩點是突出的。一方面,寫是為了更好的思考,寫作是理清思維過程的重要方式;另一方面,寫作是為了與他人更好地交流,一個單獨個體的思維的局限性只有經過與他人思維碰撞的過程才能體現出來,這樣一個人才能進步。
    基於上述理由,我今天開始寫MATLAB編程相關的技術博客。MATLAB對一個學工程的人的重要性不必多說,自己考研的方向專業今后主要工具也是MATLAB,自己又比較喜歡用MATLAB寫程序,說到這里,理由方面的充分性我想已經說完了。
    技術博客要長期堅持,這一點是至關重要的。堅持對於無論何種成功,都是核心因素之一。
    博客的主要內容主要有:MATLAB筆記,遇到的問題,需要主要的關鍵點,優秀例程,和心得體會。
 
----------------------------------------------------------------------------------------------
    傳統電話的撥號音是有兩個不同頻率的純音合成的,現在的問題是,如何從一串合成的撥號音中找到對應的電話號碼?
    一個比較正常的思路是:第一步,先對獨立的每個合成音進行處理和分析,找到對應的兩個頻率,然后得到一個對應關系表;第二步,對要處理的一串撥號音進行處理,得到時域上的對應頻率分布圖,通過查表得到撥號音代表的數字。
    下面是m主程序:
%%   這里的%%是對程序進行分塊,每塊可分步執行,快捷鍵為Ctrl+Enter
%problem1
clear all;
folder='D:\documents\Matlab\DSPLAB\dsp2\'; %folder address
files=dir([folder '*.wav'])    % dir函數讀取folder路徑下所有wav結尾的文件,並存入矩陣files
for i=1:length(files)
    file=[folder files(i).name];    
    res(i).file=file;
    try
        [y,Fs,bits]=wavread(file);    % wav文件的讀入
        res(i).y=y;        % 定義結構數組
        res(i).Fs=Fs;
        res(i).bits=bits;
    catch
        warning(['No suppot for the format.'])
    end
end
 
for k=1:11
wavplay(res(1,k).y,res(1,k).Fs)
end
 
%%  problem2
for n=1:11
A(1,n).y=mean(res(1,n).y,2);    % 對左右聲道進行平均,合成單聲道
A(1,n).y=detrend(A(1,n).y);    % 去基線,即去直流分量
end
 
%%  problem3
figure(1)    % 若要單獨輸出多個圖形,用figure函數
for u1=1:5
subplot(5,1,u1),plot(A(1,u1).y)    % 注意結構數組的數據調用,在workspace里可以理清其結構
xlabel('t')
ylabel('A')
end
figure(2)
cs=1;
for u2=6:10
subplot(5,1,cs),plot(A(1,u2).y)
xlabel('t')
ylabel('A')
cs=cs+1;
end
 
figure(3)    % 這一段是畫短時傅里葉變換頻譜圖的通用程序
for h=1:10
fs=Fs;N=length(A(1,h).y); %numh
n=0:N-1;t=n/fs;
x=A(1,h).y; %numh
y1=fft(x,N);
mag=abs(y1);
f=n*fs/N;
subplot(5,2,h),plot(f,mag);
xlim([650,1500])
xlabel('Frenquency/Hz');
ylabel('Amp');grid on;
end
 
%%  probblem4&5
figure(4)
plot(A(1,11).y)
xlabel('t')
ylabel('A')
 
%%  problem6
A(1,11).y=downsample(A(1,11).y,10);    % 降采樣處理
 
%%  problem7
fs1=Fs/10;
figure(5)
spectrogram(A(1,11).y,1024,1020,1024,fs1)    % 畫出時頻分布圖,注意spectrogram函數的參數
xlim([680 1500])
 
%%  problem8
phonenumber='18859580566'
 
%%problem9
Phonenumber_s_master='JiaYiMin'
 
    通過%problem3中的步驟,figure3中,可以得出撥號音對於頻率表。
figure3:
  對應表:
 

1209 Hz

1336 Hz

1477 Hz

697 Hz

1

2

3

770 Hz

4

5

6

852 Hz

7

8

9

941 Hz

*

0

#

 

  對目標撥號音畫出的時頻分布圖為

    對應上表,可得出電話號為:
phonenumber='18859580566'  (猜猜這是誰的號碼)
    
    編程中遇到的問題有,如何將結構數組轉變為低階的二維數組?當時用for來對10個數據進行處理時,提示錯誤為“維度不匹配!”,后來才發現原因是每個撥號音的長度是不同的,故在生成二維矩陣時列的長度不一樣,維度不匹配。
    今后需要注意的是,由於網上有海量的學習資源,基本上你遇到的問題,別人早就遇到過了,而且還分享了出來,所以有問題先去網上查,會節約很多時間;對於一些好的例程,要不恥於模仿和使用,前人的成果,可以拿來用,用的多了,懂了,就是自己的了,這時你就可以創新了,而不是想着什么都自己從頭開始,站在偉人肩膀上。
 


免責聲明!

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



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