0

我有一个 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

并得到以下结果:

在此处输入图像描述

4

2 回答 2

0

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

简而言之,如果您的 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 信号按预期显示。

于 2021-07-10T16:50:32.733 回答
0

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

我认为@mkrieger1 说得对!

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

于 2021-08-10T13:36:04.260 回答