我想分析我的音乐收藏,它是所有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)

我不太确定该从哪里去。我已经阅读了一些概念,但对我来说仍然太模糊了:
  • 窗口函数。我目前没有使用,只是天真地从音频文件0读取1024、1025到2048等(例如,binsize = 1024)。这对我有用吗?如果是这样,如何将其集成到程序中?
  • 大小的归一化和/或缩放。许多人这样做是为了制作漂亮的频谱图,但是我是否需要这样做?我了解人类的听力大致可以在对数范围内工作,所以也许我需要以某种方式对幅度结果进行按摩,以过滤掉我无论如何都无法听到的声音?这里有类似A加权的内容吗?
  • binsize。我知道更大的binsize会给我带来更多的频点...但是在这种情况下,我无法确定这是有用还是有害。

  • 我可以使用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做到这一点:
  • WAV-file analysis C (libsndfile, fftw3)
  • Converting an FFT to a spectogram
  • How do I obtain the frequencies of each value in an FFT?
  • 最佳答案

    不使用窗口功能(与使用矩形窗口相同)会将某些高频内容(FFT长度中不完全周期性的任何内容)溅入FFT结果的所有其他频率仓中,包括低频仓。 (有时这称为频谱“泄漏”。)

    为了最大程度地减少这种情况,请尝试在FFT之前应用窗口函数(von Hann等),并期望必须使用一些阈值级别,而不是期望任何bin中的内容为零。

    还要注意,许多乐器的低音音符会产生一些非常强大的高频泛音或谐波,这些高频谐波或谐波会在FFT的高音区中显示,因此您不能在出现大量高音的情况下排除强烈的低音混音频率内容。

    关于audio - 立体声音频文件的程序混合分析-低音是否平移到一个声道?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21761741/

    10-12 21:36