电话拨号音的识别——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:
电话拨号音的识别——MATLAB之旅-A01-20150416_第1张图片
  对应表:
 

1209 Hz

1336 Hz

1477 Hz

697 Hz

1

2

3

770 Hz

4

5

6

852 Hz

7

8

9

941 Hz

*

0

#

 

  对目标拨号音画出的时频分布图为

电话拨号音的识别——MATLAB之旅-A01-20150416_第2张图片
    对应上表,可得出电话号为:
phonenumber='18859580566'  (猜猜这是谁的号码)
    
    编程中遇到的问题有,如何将结构数组转变为低阶的二维数组?当时用for来对10个数据进行处理时,提示错误为“维度不匹配!”,后来才发现原因是每个拨号音的长度是不同的,故在生成二维矩阵时列的长度不一样,维度不匹配。
    今后需要注意的是,由于网上有海量的学习资源,基本上你遇到的问题,别人早就遇到过了,而且还分享了出来,所以有问题先去网上查,会节约很多时间;对于一些好的例程,要不耻于模仿和使用,前人的成果,可以拿来用,用的多了,懂了,就是自己的了,这时你就可以创新了,而不是想着什么都自己从头开始,站在伟人肩膀上。
 

转载于:https://www.cnblogs.com/ksw2024/p/4488412.html

你可能感兴趣的:(电话拨号音的识别——MATLAB之旅-A01-20150416)