如何将多个不同频率的音调混合为一个

Posted

技术标签:

【中文标题】如何将多个不同频率的音调混合为一个【英文标题】:How to mix multiple different frequency tones into one 【发布时间】:2021-01-04 11:48:01 【问题描述】:

我想使用 python 创建一个由 2kHz-3kHz 范围内的多个频率音频组成的音频。

我创建了这些函数来生成由 2 个不同频率的音调组成的音频

import numpy as np
from scipy.io.wavfile import write


def generate_hightone():
    samplerate = 44100; fs = 2000
    time = 0.5
    t = np.linspace(0., time, round(samplerate*time))
    amplitude = np.iinfo(np.int16).max
    data = amplitude * np.sin(2. * np.pi * fs * t)
    data = np.int16(data/np.max(np.abs(data)) * 32767)
    return data


def generate_lowtone():
    samplerate = 44100; fs = 2200
    time = 0.5
    t = np.linspace(0., time, round(samplerate*time))
    amplitude = np.iinfo(np.int16).max
    print(amplitude)
    data = amplitude * np.sin(2. * np.pi * fs * t)
    data = np.int16(data/np.max(np.abs(data)) * 32767)
    return data


def freq_mixer(freq1,freq2):
    print(len(freq1),len(freq2))
    return np.round(freq1*0.5).astype(int) + np.round(freq2*0.5).astype(int)


data = freq_mixer(generate_hightone(),generate_lowtone())

write("example.wav", samplerate, data)

从此音频已保存,但当我播放此音频时,没有播放任何音调。当我只保存单音时,它正在播放声音,但在混合的情况下(freq_mixer 的输出)没有声音。

还有其他混合多频音频的方法吗?

spectrogram上的输出音应该是这样的

【问题讨论】:

当然你只需要按元素添加两个数组。 如果您可以运行此代码,您会发现 example.wav 文件中没有声音输出,为什么会出现这种情况? 我认为您使用的是int,它只是将每个值折叠为0 不使用int,音频播放器显示文件损坏 你试过freq1 // 2 + freq2 // 2吗?那应该可以。 【参考方案1】:

音频数据应包含 int16 值,因为它是 16 位音频。

这里将原音转换为int16

data = np.int16(data/np.max(np.abs(data)) * 32767)

另一方面,混音器在这里创建int(与int64 相同)而不是int16

np.round(freq1*0.5).astype(int) + np.round(freq2*0.5).astype(int)

将其转换为int16 可能会起作用,但实际上,从不从int16 转到浮动并简单地这样做会更容易和更快:

freq1 // 2 + freq2 // 2

【讨论】:

【参考方案2】:

将混频器更改为float 或简单地添加音调:

def freq_mixer(freq1,freq2):
    print(len(freq1),len(freq2))
    return np.round(freq1*0.5).astype(float) + np.round(freq2*0.5).astype(float)


data1 = generate_hightone()
data2 = generate_lowtone()
data3 = data1+data2 #simpler addition
data3 = freq_mixer(generate_hightone(),generate_lowtone())
samplerate = 80000
write("example.wav", samplerate, data3)

【讨论】:

音频播放器显示错误“此项目的编码格式不受支持。” 对我来说很好,尝试在新的 Python 环境中更新 scipynumpy?或使用其他媒体播放器

以上是关于如何将多个不同频率的音调混合为一个的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中创建一个函数来播放特定频率的音调 [关闭]

从音调中去除不需要的频率

使用python从频率数组中进行音调扫描

检测原始音频 (PCM) 中的特定频率/音调

频率与音调的关系-十二平均律

在java中录制音频并确定实时是不是播放了x频率的音调,如果是这样的话