用python计算调幅

zi8p0yeb  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(351)

我有一个说“你好”的人的4秒音频样本,我设法加载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

并得到如下结果:

n9vozmp4

n9vozmp41#

你严重地过度调制了你的信号。如果你想在调幅信号上看到一个好的包络,你需要一个小于1的调制深度。有关过调制的解释,请参阅电气工程stackexchange上的这个答案。
简单地说,如果你的调幅信号是 (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的载波上。当调幅信号的正负频率图像重叠时,这将导致混叠。尝试将载波频率增加到至少10 khz。
使用更高的载波频率,您可能还必须增加采样率,以使绘图看起来更逼真。您还需要在消息信号的几个周期内放大绘图,以使am信号按预期显示。

zynd9foi

zynd9foi2#

据我所知,am需要将信号编码为位(0和1)。。。。如果你所说的调幅在广播中是调幅/调频。将信号转换为位后,使用振幅调制将位传输到另一个电台,例如,位1的振幅为100,位0的振幅为50。

相关问题