微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Python 中计算幅度调制

如何解决在 Python 中计算幅度调制

我有 4 秒 audio sample 的人说“你好”,我设法加载了 wav 文件并在时间幅度频谱中显示它,我的下一步是计算 AM(幅度调制)这个声音,我设法在我创建的正弦波上做,但在实际声音上做显然不同。

我得到了意想不到的结果,我期待 cos 形状的振幅根据声音而变化,但我得到的声音大致相同!

这是我的完整代码

def generateSignalAM(t,data):
    TWO_PI = 2 * np.pi
    fc = 100
    ac = 0.5
    carrier_wave = np.cos(t * fc * TWO_PI)
    am = carrier_wave * (1 + data/ac)

    plt.plot(t,am)
    plt.plot(time,data)
    plt.xlabel("Time(s)")
    plt.ylabel("Amplitude")
    plt.legend(['AM Signal','Original Signal'])
    plt.show()
    return am

samplerate,data = scipy.io.wavfile.read("hello.wav")
duration = len(data)/samplerate
time = np.arange(0,duration,1/samplerate) #time vector
generateSignalAM(time,data)

输出如下:

enter image description here

在@The Photon 之后,我将代码更改为:

def generateSignalAM(t,data):
    #sample rate is 44100 Hz
    TWO_PI = 2 * np.pi
    fc = 10000
    ac = 0.00005
    carrier_wave = np.cos(t * fc * TWO_PI)
    am = carrier_wave * (1 + data/ac)

    plt.plot(t,am)
    #plt.plot(time,data)
    plt.xlabel("Time(s)")
    plt.ylabel("Amplitude")
    #plt.legend(['AM Signal','Original Signal'])
    plt.show()
    return am

得到如下结果:

enter image description here

解决方法

您严重过度调制了您的信号。如果您想在 AM 信号上看到一个漂亮的包络,则调制深度需要小于 1。有关过度调制的说明,请参阅电气工程堆栈交换中的 this answer

简单地说,如果您的 AM 信号是 (1 - m(t)) cos( fc t ),其中 m(t) 是消息信号,cos( fc t ) 是载波,您希望 m(t) 的幅度小于每个时间点一个。

在您的示例中,m(t) 的幅度接近 5000(输入信号接近 -10000,您将其缩放 0.5)。

您可以在代码中调整 ac 的值,以将消息信号缩放到小于 1 的幅度。(您需要一个小于 0.0001 左右的值)

作为次要问题,人声的频率范围通常在 10 - 8000 Hz 范围内(可理解的语音需要更有限的范围),并且您正在将此信号调制到 100 Hz 载波上。这将导致混叠,因为 AM 信号的正负频率图像重叠。尝试将载波频率提高到至少 10 kHz。

使用更高的载波频率,您可能还需要提高采样率以使绘图看起来更美观。您还需要在消息信号的几个周期内放大绘图,以使 AM 信号如预期的那样显示。

,

我会把它作为评论,但我没有足够的声誉。

我认为@mkrieger1 说得对!

您对调制信号和载波信号使用相同的采样率。载波信号应具有至少两倍于载波频率的采样频率,并且该采样频率应远高于最大预期音频频率。但是,您使用的是实际上在音频频段内的 10KHz 载波。如果我没记错的话,长波 AM 收音机的起始频率是 153kHz,那么采样应该至少在 306kHz 进行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。