在 Python 中计算幅度调制

Posted

技术标签:

【中文标题】在 Python 中计算幅度调制【英文标题】:Calculate Amplitude Modulation in Python 【发布时间】:2021-09-20 12:30:18 【问题描述】:

我有 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)

这是输出:

在@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

得到以下结果:

【问题讨论】:

据我了解,AM 需要将信号编码为位(0 和 1)......如果您所说的 AM 在无线电环境中是 AM/FM。在将信号转换为比特后,您可以使用幅度调制将这些比特传输到另一个站点,例如。位 1 的幅度为 100,位 0 的幅度为 50。 您将数据与与信号本身处于相同频率范围的 100 Hz 信号相乘,我不确定您期望得到什么结果。 提示:您系统中的调制深度是多少? (这不是真正的编程问题,而是关于调制如何工作的问题。您可能会在 dsp 或电子堆栈交换中得到更好的答案) 【参考方案1】:

您严重过度调制信号。如果您想在 AM 信号上看到漂亮的包络,您需要调制深度小于 1。有关过调制的解释,请参阅电气工程 Stackexchange 上的 this answer。

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

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

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

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

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

【讨论】:

嘿,我已经根据您所说的更改了代码,并在我的问题中添加了输出,请您检查一下,并就您认为正在发生的事情给我一个反馈,因为我仍然没有没有得到我的期望。【参考方案2】:

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

我认为@mkrieger1 说对了!

您对调制信号和载波信号使用相同的采样率。载波信号的采样频率应该至少是载波频率的两倍,并且这个频率应该比最大预期音频频率高很多。但是,您使用的是实际上在音频频带内的 10KHz 载波。如果我没记错的话,长波 AM 收音机从 153kHz 开始,所以采样应该至少在 306kHz 进行。

【讨论】:

以上是关于在 Python 中计算幅度调制的主要内容,如果未能解决你的问题,请参考以下文章

matlab绘制正弦函数幅度调制初步Inner matrix dimensions must agree错误

计算机中的base文件是啥意思

正交幅度调制QAM

正交幅度调制QAM

Python科学计算——检包络与去包络

[转] 模拟调制解调电路原理