我想分析我的音乐收藏,这是所有 CD 音频数据(立体声 16 位 PCM,44.1kHz)。我想要做的是以编程方式确定低音是否仅混合(平移)到一个 channel 。理想情况下,我希望能够运行这样的程序
mono-bass-checker music.wav
并让它输出诸如“低音未平移”或“低音主要混合到 channel 0”之类的内容。
我对此有一个初步的开始,在伪代码中如下所示:
binsize = 2^N # define a window or FFT bin as a power of 2
while not end of audio file:
read binsize samples from audio file
de-interleave channels into two separate arrays
chan0_fft_result = fft on channel 0 array
chan1_fft_result = fft on channel 1 array
for each index i in (number of items in chanX_fft_result/2):
freqency_bin = i * 44100 / binsize
# define bass as below 150 Hz (and above 30 Hz, since I can't hear it)
if frequency_bin > 150 or frequency_bin < 30 ignore
magnitude = sqrt(chanX_fft_result[i].real^2 + chanX_fft_result[i].complex^2)
我真的不知道从这里去哪里。我读过的一些概念,但对我来说仍然太模糊:
我可以像这样使用 sox 生成“单声道贝司歌曲”:
sox -t null /dev/null --encoding signed-integer --bits 16 --rate 44100 --channels 1 sine40hz_mono.wav synth 5.0 sine 40.0
sox -t null /dev/null --encoding signed-integer --bits 16 --rate 44100 --channels 1 sine329hz_mono.wav synth 5.0 sine 329.6
sox -M sine40hz_mono.wav sine329hz_mono.wav sine_merged.wav
在生成的“sine_merged.wav”文件中,一个 channel 是纯低音 (40Hz),一个是非低音 (329 Hz)。当我计算该文件的每个 channel 的低音频率幅度时,我确实看到了显着差异。但令人好奇的是,329Hz channel 具有非零低于 150Hz 的幅度。我希望它为零。
即便如此,对于这个由 sox 生成的琐碎文件,我真的不知道如何解释我正在生成的数据。显然,我不知道如何将其推广到我的实际音乐收藏中。
FWIW,我正在尝试使用 C 中的 libsndfile 和 fftw3 执行此操作,基于这些其他帖子的帮助:
最佳答案
不使用窗口函数(与使用矩形窗口相同)会将一些高频内容(FFT 长度中不完全周期性的任何内容)飞溅到 FFT 结果的所有其他频率箱中,包括低频箱。 (有时这被称为光谱“泄漏”。)
为了尽量减少这种情况,请尝试在 FFT 之前应用窗口函数(von Hann 等),并期望必须使用一些阈值水平,而不是期望任何 bin 中的内容为零。
另请注意,来自许多乐器的低音音符会产生一些非常强大的高频泛音或泛音,这些泛音或谐波会出现在 FFT 的上部箱中,因此您不能排除强烈的低音混音与大量高音的存在。频率内容。
关于audio - 立体声音频文件的程序化混合分析 - 是否将低音平移到一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761741/