在 Python 中计算频率调制

Posted

技术标签:

【中文标题】在 Python 中计算频率调制【英文标题】:Calculate Frequency Modulation in Python 【发布时间】:2021-09-21 21:51:27 【问题描述】:

我正在尝试计算给定音频文件(12 秒)的频率调制(无线电上下文),我设法使用以下公式在正弦波上进行计算:

fm = np.sin(TWO_PI * (fc + b * data) * t)

其中 fc 是载波频率,b 是调制索引,data 是音频文件,t 是时间向量。

但我似乎无法让它在音频文件上工作,

这是我目前所拥有的:

如您所见,您无法真正了解频率何时发生变化,我可以放大,但这并不可靠且令人困惑,我很乐意听到其他方式。

这是我的完整代码:

import scipy.io.wavfile
import matplotlib.pyplot as plt
import numpy as np

def generateSignalFM(t,data):
    TWO_PI = 2 * np.pi
    fc = 10000
    b = 5

    fm = np.sin(TWO_PI * (fc + b * np.array(data)) * t) # calculaying frequency modulation

    fig, axs = plt.subplots(nrows=2, ncols=1)
    fig.tight_layout()

    axs[1].plot(t,fm)
    axs[1].set_xlabel("Time(s)")
    axs[1].set_ylabel("Amplitude")
    axs[1].set_title("Modulated Signal (FM)")

    axs[0].plot(t,data)
    axs[0].set_xlabel("Time(s)")
    axs[0].set_ylabel("Amplitude")
    axs[0].set_title("Original Signal")
    plt.show()

samplerate, data = scipy.io.wavfile.read("musicSample.wav")
sample_for = 12
start_time = 30*samplerate # start from 30 seconds
end_time = start_time + (samplerate * sample_for) # sample for 1 second
split_data= data[start_time:end_time]
time = np.arange(0,sample_for,1/samplerate) #sample 1 second

【问题讨论】:

问题更适合Signal Processing 如果我在这里找不到答案,可能会在那里发帖。 不知道你从哪里得到这个公式,但它甚至不接近计算 F.M.没有一维公式可以为您提供像音频这样的多分量信号的调频。 查看This answer.@OverLordGoldDragon 【参考方案1】:

您可以使用“welch”算法查看调制后信号的 PSD。您可以通过scipy.signal.welch 进行操作,将显示如下内容:

这是 fc = 100 和 sampleRate=1000 的示例

要看到这一点,您应该在代码中使用以下上下文:

import scipy.signal as ss
FM = ss.welch(fm, fs=sampleRate, nperseg=2048, noverlap=1024, nfft=2048)
axs[0].plot(FM[0],FM[1])

【讨论】:

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

计算机网络--物理层

在 Python 中计算幅度调制

计算机网络带宽理解

计算列表中单词的频率并按频率排序

计算 Python 字符串中的字符频率

计算字符串中的字母频率(Python)[重复]