audio - 立体声音频文件的程序化混合分析 - 是否将低音平移到一个 channel ?

标签 audio signal-processing fft

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

我真的不知道从这里去哪里。我读过的一些概念,但对我来说仍然太模糊:
  • 窗口功能。我目前没有使用一个,只是天真地从音频文件中读取 0 到 1024、1025 到 2048 等(例如 binsize=1024)。这对我有用吗?如果是这样,它是如何集成到程序中的?
  • 幅度的标准化和/或缩放。很多人这样做是为了制作漂亮的光谱图,但我需要这样做吗?我了解人类的听力大致在对数范围内工作,所以也许我需要以某种方式按摩幅度结果以过滤掉我无论如何都无法听到的内容?像A加权这样的东西在这里吗?
  • 装箱。我知道更大的 binsize 可以让我获得更多的频率 bin ......但我无法确定在这种情况下这是否有帮助或伤害。

  • 我可以像这样使用 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 执行此操作,基于这些其他帖子的帮助:
  • 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 - 立体声音频文件的程序化混合分析 - 是否将低音平移到一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761741/

    相关文章:

    python - 有效计算信号的 50Hz 内容

    matlab - 如何在 Matlab 中绘制二维 FFT?

    c++ - 给定类型为 Container<T>::Iterator 的函数参数,我如何实现特定类型 T 的特定重载?

    flutter - 无法在Flutter中向计时器添加音频

    python - 使用 Python 对原始信号应用合适的巴特沃斯滤波器

    c++ - 'sample' 在 VST 中包含什么信息?

    java - 如何确定音频样本的频率大小和相位角?

    Qt Symbian 音频级别

    python - pygame使用pygame.mixer.music.load(file)播放声音会给出NoneType错误

    audio - 树莓不播放任何声音(树莓派)