Skip to content

Instantly share code, notes, and snippets.

@bczhc
Created December 27, 2025 05:04
Show Gist options
  • Select an option

  • Save bczhc/fc1080913e4ef6e4215cfd160f942a4a to your computer and use it in GitHub Desktop.

Select an option

Save bczhc/fc1080913e4ef6e4215cfd160f942a4a to your computer and use it in GitHub Desktop.
频域操作实验

使用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,应用两倍增益,则迭代数次后,输出音频与原音频无差别。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment