使用Rust写如下程序,用到主要crate有realfft、hound。
读入音频/home/bczhc/Music/2.wav,其总采样点数为N。对左右声道分别实数dft,fft点数为N。
对输出的结果进行降采样,设置一个缩放系数,比如为2.0,那就分配一个新的频域采样数组长度为N/2.0,然后把原fft结果降采样映射到新数组,不能有truncate,也就是新数组第一个元素是旧数组第一个元素,新数组最后一个元素就是旧的最后一个。
把新数组idft成新的音频,输出到/home/bczhc/out.wav,idft点数为新数组的长度。
左右声道的处理部分抽取成函数。缩放系数置为常量。
效果:新音频长度变为原音频长度/缩放系数,不变调不变速,但听起来像在时域上叠加起来了。
对等长的两段音频1和音频2,各自拥有N采样点,都进行realfft,fft点数为N。把结果交错(形如[fft1[0], fft2[0], fft1[1], fft2[1], fft1[2], ...]),长度为2N,最后的结果再idft回新的音频,点数为2N。
效果:新音频为原音频的两倍长度,不变调不变速,听起来像两段音频叠加在一起,然后又重复播放了两遍。
使用hound读入音频/home/bczhc/Music/2.wav,双声道,每个声道的总采样点数为N。
使用realfft对左右声道分别fft并处理,fft点数为N。
fft的结果长度为N/2+1,分配一个新数组长度为其两倍,然后填充如下:
[fft[0], fft[0], fft[1], fft[1], fft[2], ...]重新idft回新的时域信号,idft点数为新数组的总长。
对这个时域信号截取前一半。
重复刚才所有逻辑,重复常量REPEAT_N(默认为一)次。
最后输出最终的音频。
迭代数次后,输出音频和原音频无明显差别,但后半部分音量开始减少。
如果填充模式换成[fft[0], 0, fft[1], 0, fft[2], 0, ...],并且在每轮迭代idft后的PCM,应用两倍增益,则迭代数次后,输出音频与原音频无差别。