xmax2=xk(m);
max2=m;
end
end
max1=max1-1;
max2=max2-1;
if(max1>max2)
k=max1;
max1=max2;
max2=k;
end
disp('');
disp('');
disp('------------------------经过传输后知道如下--------------------------------');
switchmax1
case18
switchmax2
case31
disp('你输入的是-------1');
a=[max1max2];
b=[6971209];subplot(313);
stem(a,b);
xlabel('k');
ylabel('f');
grid;
case34
disp('你输入的是-------2');
a=[max1max2];
b=[6971336];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case37
disp('你输入的是-------3');
a=[max1max2];
b=[6971447];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case43
disp('你输入的是-------A');
a=[max1max2];
b=[6971663];subplot(313);
stem(a,b);xlabel('k');
ylabel('f');grid;
end
case20
switchmax2
case31
disp('你输入的是-------4');
a=[max1max2];
b=[7701209];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case34
disp('你输入的是-------5');
a=[max1max2];
b=[7701336];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case37
disp('你输入的是-------6');
a=[max1max2];
b=[7701447];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case43
disp('你输入的是-------B');
a=[max1max2];
b=[7701663];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
end
case22
switchmax2
case31
disp('你输入的是-------7');
a=[max1max2];
b=[8521209];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case34
disp('你输入的是-------8');
a=[max1max2];
b=[8521336];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case37
disp('你输入的是-------9');
a=[max1max2];
b=[8521447];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case43
disp('你输入的是-------C');
a=[max1max2];
b=[8521663];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
end
case24
switchmax2
case31
disp('你输入的是-------*');
a=[max1max2];
b=[9411209];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case34
disp('你输入的是-------0');
a=[max1max2];
b=[9411336];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case37
disp('你输入的是-------#');
a=[max1max2];
b=[9411447];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
case43
disp('你输入的是-------D');
a=[max1max2];
b=[9411663];subplot(313);
stem(a,b);xlabel('k');ylabel('f');grid;
end
end
disp('');;sh
disp('');
disp('');
temp=input('是否要继续按键Y|y---是N|n--退出','s');
if(temp==['n']|temp==['N'])break;;
end
disp('');
end
七、程序结果及图表:
a=input('输入数字=','s');
sm=abs(a);%输入数字的ASCII值
pm=[49505165;52535466;55565767;42483568];%给出图表字母的相应ASCII值矩阵
forp=1:
4;
forq=1:
4;
ifpm(p,q)==sm;break,end
end
ifpm(p,q)==sm;break,end
end%通过两个for循环判断键盘输入字母的具体行和列
fprintf('ASCII码值AM=%0.f\n',pm(p,q))
f1=[697770852941];
f2=[1209133614471663];
n=0:
204;
x=sin(2*pi*n*f1(p)/8000)+sin(2*pi*n*f2(q)/8000);%DTMF信号的生成
figure('color','g');
subplot(211);
plot(x);
xlabel('n');
ylabel('x');
title('DTMF信号');
k=[1820222431343843];%给出8个频率点
va=zeros(1,8);%生成一个1行8列的零矩阵
form=1:
8;
Fx(m)=gfft(x,205,k(m));%对信号x进行205点上DFT变换,再取和k对应的8点上DFT变化并相应的放入Fx(m)
end
va=abs(Fx);
subplot(212);
stem(k,va);
xlabel('k');
ylabel('|X(k)|');
l1=80;
l2=7.8;%判断标准
fors=5:
8;
ifva(s)>l2;break,end
end
forr=1:
4;
ifva(r)>l1;break,end
end%通过判断标准判断出相应的行和列
disp(['拨号符号=',setstr(pm(r,s-4))])%输出判断出的相应行、列ASCII值矩阵对应的符号
结果及图示如下:
输入数字=1,ASCII码值AM=,49拨号符号=1
图一
输入数字,=2ASCII码值AM=50拨号符号,=2
图二比较以上两图,每幅图的上面均为该字母所对应的两固定频率所产生的DTMF信号,且它们只是205点上的离散信号,下图是对该字母DTMF信号x进行205点上DFT变换,再取和k对应的8点(1820222431343843)上DFT变化的幅值,其中前4点决定该字母所在原矩阵中的行,后4点决定该字母所在原矩阵中的列,该图也证明了前四点表示的意义。
输入数字=4
ASCII码值AM=52图三
拨号符号=4
比较图一、图三,可以看出后四点表示的是字母所在原矩阵中的列,该图也证明了后四点表示的意义。
以上三幅图均证明了程序的正确。
因为采样频率是8000Hz,因此要求每125ms输出一个样本,得到的序列再送到D/A变换器和平滑滤波器,输出便是连续时间的DTMF信号。
DTMF信号通过电话线路送到交换机。
基于Goertzel算法的双音多频信号检测
在接收端,要对收到的双音多频信号进行检测,检测两个正弦波的频率是多少,以判断所对应的十进制数字或者符号。
显然这里仍然要用数字方法进行检测,因此要将收到的时间连续DTMF信号经过A/D变换,变成数字信号进行检测。
检测的方法有两种,一种是用一组滤波器提取所关心的频率,根据有输出信号的2个滤波器判断相应的数字或符号。
另一种是用DFT(FFT)对双音多频信号进行频谱分析,由信号的幅度谱,判断信号的两个频率,最后确定相应的数字或符号。
当检测的音频数目较少时,用滤波器组实现更合适。
FFT是DFT的快速算法,但当DFT的变换区间较小时,FFT快速算法的效果并不明显,而且还要占用很多内存,因此不如直接用DFT合适。
下面介绍Goertzel算法,这种算法的实质是直接计算DFT的一种线性滤波方法。
这里略去Goertzel算法的介绍,可以直接调用MATLAB信号处理工具箱中戈泽尔算法的函数Goertzel,计算N点DFT的几个感兴趣的频点的值。
二语音合成与语音识别
语音识别的发展历史
早在计算机发明之前,自动语音识别的设想就已经被提上了议事日程,早期的声码器可被视作语音识别及合成的雏形。
而1920年代生产的"RadioRex"玩具狗可能是最早的语音识别器,当这只狗的名字被呼唤的时候,它能够从底座上弹出来。
最早的基于电子计算机的语音识别系统是由AT&T贝尔实验室开发的Audrey语音识别系统,它能够识别10个英文数字。
其识别方法是跟踪语音中的共振峰。
该系统得到了98%的正确率。
到1950年代末,伦敦学院(ColledgeofLondon)的Denes已经将语法概率加入语音识别中。
1960年代,人工神经网络被引入了语音识别。
这一时代的两大突破是线性预测编码LinearPredictiveCoding(LPC),及动态时间弯折DynamicTimeWarp技术。
语音识别技术的最重大突破是隐含马尔科夫模型HiddenMarkovModel的应用。
从Baum提出相关数学推理,经过Labiner等人的研究,卡内基梅隆大学的李开复最终实现了第一个基于隐马尔科夫模型的大词汇量语音识别系统Sphinx。
[1]。
此后严格来说语音识别技术并没有脱离HMM框架。
尽管多年来研究人员一直尝试将“听写机”推广,语音识别技术在目前还无法支持无限领域,无限说话人的听写机应用。
语音识别概述
语音识别技术,也被称为自动语音识别AutomaticSpeechRecognition,(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。
与说话人识别及说话人确认不同,后者尝试识别或确认发出语音的说话人而非其中所包含的词汇内容。
语音识别技术的应用包括语音拨号、语音导航、室内设备控制、语音文档检索、简单的听写数据录入等。
语音识别技术与其他自然语言处理技术如机器翻译及语音合成技术相结合,可以构建出更加复杂的应用,例如语音到语音的翻译。
语音识别技术所涉及的领域包括:
信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
语音合成
语音是信息传播的一大媒介。
近年来,提供语音服务的语音系统迅速发展起来。
传统的语音系统一般采用预录音回放技术,由于这种方法必须对信息文本事先进行录音,并存为声音文件,因此,所占用的存储空间很大。
另外,一个更大的缺点是不能实时反映信息的更新,应用范围有很大的局限性。
现在的语音合成技术,无需对大量的信息进行录音,极大地减少了工作量和节省了存储空间,尤其是在信息内容需要经常变动的动态查询场合,如股市行情查询、有声Email系统,都是传统的预录音技术无法代劳的。
结合其他技术,语音合成技术可以广泛应用于金融、邮电、工商、政府机关、交通、教育、游戏等领域。
传统的语音系统
输入语音
语音信号的参数合成
根据语音产生的数学模型,利用短时平稳性,提出每帧语音信号的参数,这些参数经编码后组成一个语音参数库。
输出时,从语音参数库中取出相应的参数,利用语音产生的数学模型恢复语音。
共振峰合成和线性预测合成是该类合成技术中的重要方法。
直接录放流程
输入语音
波形合成方法
输入语音
合成语音
语音信号的规则合成
将任意文本转换成声音的系统。
包括语言学和声学处理。
合成的词汇不是事先确定。
常见的就是文语转换合成技术。
系统中存储的是音素的声学参数,以及由音素组成音节、由音节组成词、由词组成句子的规则;控制音调、轻重音等韵律的各种规则。
在波形合成法中,也可以使用波形编码技术略微压缩一些存储量。
通常情况下,波形合成法可以合成的语音词汇量约在500以下,而参数合成法则可以达到数千左右。
当然,在参数合成时,由于抽取参数或编码过程中,难免存在逼近误差,所以合成的语音质量(清晰
度)也就比波形合成法要差一些了。
在语音合成中,另一个重要问题就是合成基元的选择问题,也就是存储的语音基元的选择问题。
显然,合成词汇量越大,必须采用越小的基元,否则存储量就太大了;反之,合成词汇量越小,可用较大的基元。
例如在英语中,词的数量有千千万万,但是音素质有成百个。
因此存储全部