此示例显示如何使用离散余弦变换(DCT)压缩语音信号。
加载包含“强”单词的文件,由一个女人和一个男人说话。信号在8 kHz时采样。
加载(全氟(MatlaBroot,'例子'那'信号'那'strong.mat')))%听到,键入soundsc(她,fs),暂停(1),soundsc(他,fs)
使用离散余弦变换来压缩母语音信号。将信号分解为DCT基础向量。在分解中存在许多术语,因为信号中存在样本。向量中的膨胀系数X
测量每个组件中存储多少能量。将系数排序到最大的系数。
x =她';x = DCT(x);[xx,IND] =排序(ABS(x),“下降”);
找到有多少DCT系数表示信号中能量的99.9%。将数字表示为总数的百分比。
需要= 1;尽管rang(x(ind(1:需要)))/ rang(x)<0.999需要=需要+ 1;结尾XPC =需要/长度(x)* 100;
设置为零的系数,该系数包含剩余的0.1%的能量。从压缩表示重建信号。绘制原始信号,重建,两者之间的差异。
x(IND(需要+ 1:结束))= 0;xx = IDCT(x);绘图([x; xx; x-xx]')传奇('原来的',[Int2str(XPC)'%的Coeffs。'],'区别'那......'地点'那'最好')
%以听到,键入soundsc(x,fs),暂停(1),soundsc(xx,fs)
重复男声的分析。找到有多少DCT系数代表99.9%的能量,并表示为总数的百分比。
y =他';Y = DCT(Y);[YY,IND] =排序(ABS(Y),“下降”);需要= 1;尽管规范(Y(ID(1:需要))/ QUAR(Y)<0.999需要=需要+ 1;结尾YPC =需求/长度(Y)* 100;
将其余系数设置为零并从压缩版本重建信号。绘制原始信号,重建,两者之间的差异。
Y(IND(需要+ 1:结束))= 0;YY = IDCT(Y);情节([Y; YY; Y-YY]')传奇('原来的',[Int2str(YPC)'%的Coeffs。'],'区别'那......'地点'那'最好')
%要听到,键入soundsc(y,fs),暂停(1),soundsc(yy,fs)
在这两种情况下,大约一半的DCT系数足以合理地重建语音信号。如果所需的能量分数为99%,则必要系数的数量降低到总量的约20%。由此产生的重建是较差的,但仍然可理解。
对这些和其他样品的分析表明,需要更多系数来表征男人的声音而不是女人的声音。