题目:fuck the function “reshape” in matlab
=====================引言=======================
用Matlab编一个基于LPC编码的语音信号压缩与恢复的小程序,程序很快,只是到最后的结果始络不对,一下子耗费了我一晚上的时间,现在查出来原来是reshape函数用错了,气愤到了极点,也怪自己没有注意……
一段语音信号,以30ms为基本单位进行无重叠分段,然后对每一段求LPC系数,求平均能量,求过零点个数……
然后以过零点个数判断是voiced还是unvoiced,如果是voiced,就产生一个脉冲串,使用前面对应求得的LPC系数进行重建,如果是unvoiced,就产和一个正态分布白噪声,使用前面对应求得的LPC系数进行重建,然后分别再用前面求得的平均能量对重建的信号幅度进行scale,最后把重建的每一段拼在一起就是恢复的信号了。
本身这就是一个最简单的LPC语音合成而已:
虽然是第一次接触,但原理如此简单,不应该不出结果的啊。
再说一点背景,以语音信号以30ms为基本单位进行无重叠分段后使用一个reshape函数将其由一个行向量(或列向量)变为一个M*N的矩阵,没想到就栽这儿了……
=====================正文=======================
举个简单例子看一下reshape函数的用法吧:
>> x=1:20;
>> y=reshape(x,4,5)
y =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
从上面可以很清楚的看出来,将一个1*20的行向量通过reshape变成一个4*5的矩阵,注意新得到的矩阵中元素的顺序,是先填满第一列再填满第二列。。。
而我默认以是是先填满第一行再填满第二行。。。
也就是我心里一直想的结果应该是这是这样子的:
y =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
因为我在程序中是取第一行为头30ms数据,第二行为第二个30m数据的,但实际上不是我想的那样子……
一晚上时间啊……
使用matlab自带的函数时Help它一个固然重要,要不你不知道怎么用,但还是用一个简单的例子看一下结果为好,比如这个reshape函数,如果我早一点运行这么一个简单的结果就不会耗一晚上的时间了……
教训啊教训……
满眼都是泪啊……