我想分析我的音乐收藏,它是所有CD音频数据(立体声16位PCM,44.1kHz)。我要做的是通过编程确定低音是否仅混合(平移)到一个声道。理想情况下,我希望能够运行这样的程序
mono-bass-checker music.wav
并输出类似“低音未平移”或“低音主要混合到通道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”文件中,一个声道为纯低音(40Hz),另一个声道为非低音(329Hz)。当我为该文件的每个通道计算低音频率的幅度时,我确实看到了很大的不同。但奇怪的是,329Hz通道的150Hz幅度不为零。我希望它为零。
即使那样,用这个琐碎的sox生成的文件,我也真的不知道如何解释我生成的数据。显然,我不知道如何概括我的实际音乐收藏。
FWIW,基于这些其他文章的帮助,我正在尝试使用C语言中的libsndfile和fftw3做到这一点:
最佳答案
不使用窗口功能(与使用矩形窗口相同)会将某些高频内容(FFT长度中不完全周期性的任何内容)溅入FFT结果的所有其他频率仓中,包括低频仓。 (有时这称为频谱“泄漏”。)
为了最大程度地减少这种情况,请尝试在FFT之前应用窗口函数(von Hann等),并期望必须使用一些阈值级别,而不是期望任何bin中的内容为零。
还要注意,许多乐器的低音音符会产生一些非常强大的高频泛音或谐波,这些高频谐波或谐波会在FFT的高音区中显示,因此您不能在出现大量高音的情况下排除强烈的低音混音频率内容。
关于audio - 立体声音频文件的程序混合分析-低音是否平移到一个声道?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21761741/