在 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 中计算幅度调制的主要内容,如果未能解决你的问题,请参考以下文章