使用 python 进行 FSK 调制

信息处理 Python fsk
2022-02-18 23:17:11

我对DSP很陌生,我正在尝试用python实现一个BFSK信号,但是由于某种原因,波形并不“清晰”,而且两者之间的过渡似乎有很多“不连续阶段”频率。

这是用 mathplot 绘制的信号,您可以清楚地看到:

我用来生成信号的代码:

import numpy as np
import random
import matplotlib.pyplot as plt


sampling_rate = 44100
baud_rate = 300
samples_per_bit = 1.0 / baud_rate * sampling_rate

# tones representing bits, dummy data (0,1)
bits_in_tones = [1200, 2200] * 100
random.shuffle(bits_in_tones)
bit_arr = np.array(bits_in_tones)

symbols_freqs = np.repeat(bit_arr, samples_per_bit)

t = np.arange(0, len(symbols_freqs) / sampling_rate, 1.0 / sampling_rate)

signal = np.sin(2.0 * np.pi * symbols_freqs * (t))


plt.plot(signal)
plt.show()

无法弄清楚我做错了什么。任何帮助将不胜感激。

1个回答

输出信号的相位不是连续的,因为您已将相位实现为两个独立频率振荡器之一的输出,两者都从 time 开始0,因此当您切换频率时,它们的相位不同步。

我们可以通过注意到相位是瞬时频率随时间的积分来获得连续相位:

ϕ(t)=t2πfi(τ)dτ=tdϕ(τ)

或离散时间当量,归一化1奈奎斯特频率波的样本等效于π相位增量的弧度(或者,等效地,设置Δt=1/Fs,持续时间1采样时间):

ϕ[n]=k=0nπFs2fi[k]=k=0n2πfi[k]Δt=k=0nΔϕ[k]

通过对脚本的一个小补充来证明这一点:

import numpy as np
import random
import matplotlib.pyplot as plt


sampling_rate = 44100
baud_rate = 300
samples_per_bit = 1.0 / baud_rate * sampling_rate

# tones representing bits, dummy data (0,1)
bits_in_tones = [1200, 2200] * 100
random.shuffle(bits_in_tones)
bit_arr = np.array(bits_in_tones)

symbols_freqs = np.repeat(bit_arr, samples_per_bit)

t = np.arange(0, len(symbols_freqs) / sampling_rate, 1.0 / sampling_rate)

signal = np.sin(2.0 * np.pi * symbols_freqs * (t))


plt.plot(signal)
plt.show()

# New lines here demonstrating continuous phase FSK (CPFSK)
delta_phi = symbols_freqs * np.pi / (sampling_rate / 2.0)
phi = np.cumsum(delta_phi)
signal2 = np.sin(phi)

plt.plot(t, signal+1.0)
plt.plot(t, signal2-1.0)
plt.show()

当然,这个实现会遇到数值问题:随着我们不断增加相位,我们将开始失去精度。此外,将参数传递给sin()远远超出区间的函数[2π,2π]. 您需要包装阶段以将其保留在[0,2π)当您累积求和时,与我在这里所做的天真、方便的累积求和相反。

以下是原始切换 FSK 实现与 CPFSK 实现的输出比较: 切换 FSK 与 CPFSK 输出信号的比较