我想分析我的音乐收集,这是所有的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“文件中,一个通道是纯低音(40 Hz),另一个是非低音(329 Hz)。当我计算该文件的每个频道的低音频率的大小时,我确实看到了一个显著的差异。但奇怪的是,329赫兹通道的震级为非零,低于150赫兹。我希望是零。
即使这样,对于这个微不足道的sox生成文件,我也不知道如何解释我正在生成的数据。显然,我不知道如何概括到我的实际音乐收藏。
FWIW,我试图使用C中的libsndfile和fftw3来实现这一点,基于其他帖子中的帮助:
发布于 2014-02-14 01:24:13
不使用窗口函数(与使用矩形窗口相同)会将一些高频内容(任何在FFT长度中不完全周期性的内容)溅到FFT结果的所有其他频率桶中,包括低频回收箱。(有时这被称为光谱“泄漏”。)
要最小化这一点,请尝试应用一个窗口函数(von Hann等)。在FFT之前,预期要使用一定的阈值级别,而不是期望在任何垃圾箱中的内容为零。
还要注意的是,来自许多乐器的低音音符可以产生一些非常强大的高频信号或谐波,它们会出现在快速傅立叶变换( FFT )的上层回收箱中,所以你不能排除很强的低音混音,不存在大量的高频内容。
https://stackoverflow.com/questions/21761741
复制相似问题