|
原帖由 nansen 于 2012-8-17 00:18 发表
ATmega8L 你这个是8pu的吗?
应该是,用的是内部rc振荡器,最大只能到8MHz。
电路一直是9楼的那个。
程序在19楼,原理是波表合成(wave table)和自己瞎编的算法:
1.先对原始声音做频谱分析(我用的是Adobe Audition),确定基频的变化范围。然后选几个频率点,截取声音(用Matlab),一般多截取几个周期的波形,声音就不会太单调
2.声卡的波表合成用的是DSP,单片机没那速度,原始声音需要事先调整采样率。用Matlab把高频率的声音插值到低频率的声音时长,就是程序里开头acl1_hi[470]命名声音,那是高频的acl2_lo[386]插值到470点的声音,以此类推
3.声音准备好后,就写单片机的程序。
在过渡时,减小一个声音,增大另一个声音,就是timer0_ovf_isr(void)里的temp=((temp1*c_lo+temp2*c_hi)>>4);
从某两个声音合成跳到另两个声音合成时,使用了相位调整,而不是从头播放样本。就是int0_isr里那个多层判断的n=(n*n_reorder[n_from][0])>>6。为避免使用除法,提前算好结果存在n_reorder[7][7],是放大64后的整数,所以会需要右移6位。估计不调整相位也不会有问题
[ 本帖最后由 348826281 于 2012-8-19 21:42 编辑 ] |
|