🥬Python嵌入式动态用户调制解调响应式射频信号

关键词

Python | 嵌入式 | 数字信号 | 物理 | 动态 | 调制解调 | 响应式 | 射频 | 无线电 | 连续 | 正弦波 | 频率 | 混叠 | 量化 | 模数转换 | 幅度 | 分辨率 | 离散 | 误差 | 噪声 | 采样 | 时域图 | 滤波 | 算法 | 频谱分析 | 基带 | 功率谱 | 傅里叶 | 频谱图 | 波形 | 信噪比 | 矢量 | 复频 | 奇偶校验 | 低密度 | 软决策对数似然比 | 公式 | 方程

🏈page指点迷津 | Brief

🎯要点

  1. 嵌入式数字信号处理物理计算公式或方程及Python实现:

    1. 🎯离散信号取样:🖊生成连续正弦波,🖊对比不同采样率,🖊混叠。

    2. 🎯量化过程:🖊模数转换后的模拟幅度映射到一组离散值,🖊分辨率和离散级别,🖊误差和噪声。

    3. 🎯模数转换和数模转换:🖊采集信号时抗混叠滤波器和过采样,🖊信号重建,🖊绘制时域图,🖊自定义处理参数并观察结果。

    4. 🎯数字滤波设计:🖊修改信号频率:低通、高:通、带通、带阻,🖊绘制每种类型的幅度响应,🖊使用方法或算法:窗口法、Parks McClellan 算法和最小二乘法。

    5. 🎯信号频谱分析:🖊计算频谱,绘制频谱图,🖊光谱分析:傅里叶级数和复傅里叶级数,方波和锯齿波谐波分析,展示任意周期波形的频谱内容,使用欧拉方程,🖊离散傅里叶变换:频域分析时域波形,光谱分辨率和泄漏、计算功率谱和补零技术,🖊快速傅里叶变换:使用时间抽取技术,对比离散傅里叶和快速傅里叶变换,实现频谱图。

    6. 🎯基带无线信号调制:🖊二元相移键控、正交相移键控和正交幅度调制,🖊评估加性高斯白噪声:测量信噪比,计算误差矢量幅度和误码率,🖊脉冲整形和匹配滤波:模拟二元相移键控传输,方波脉冲整形,sinc 形滤波器实现理想带宽限制响应,计算绘制升余弦滤波响应,计算绘制根升余弦匹配的过滤。

    7. 🎯分析复频域信号:🖊幅度调制解调:解调基带信号和相位误差,🖊正交幅度调制解调:快速傅里叶变换计算,计算相位误差,🖊复正交幅度调制解调:计算和绘制。

    8. 🎯频率规划:计算非线性响应影响放大器的输出,模拟交错模数转换引入杂散,计算混叠后杂散的位置。

    9. 🎯动态用户控制射频:射频系统发送端和接收端调制方式,接收端消息方式,图像传输,前向纠错和奇偶校验矩阵,使用低密度奇偶校验在硬件上编码,使用软决策对数似然比解调数据。

🍇Python生成对抗网络测试信号处理

测试目标:

  • 我们将生成受控数据集并对其进行描述。

  • 定义我们的机器学习模型:我们将描述生成对抗网络模型的具体特征。

  • 探索结果:我们将运行生成模型并使用代理模型来提取信号。

来自电气/机械工程师设置的大多数信号都是正弦信号。这意味着输出信号在某种程度上是这样的:

y=A×sin(ωx)+b y=A \times \sin (\omega x)+b

  • A 是信号的幅度

  • 欧米伽是频率

  • b 是偏置

实际上,在现实世界的实验中,我们有噪声元素。 现在,噪声有很多种,并且它们都有各自的彩色对。 最典型的噪声之一是所谓的高斯白噪声,它是一种存在于所有频率并具有高斯分布的噪声。所以目标信号看起来更像是这样的:

y=Asin(ωx+b)+N(μ,σ) y=A \sin (\omega x+b)+ N (\mu, \sigma)

  • 平均值通常为 0

  • 标准差可能会有所不同,但可以安全地假设它为 1 并且在我们的实验中是固定的。

  • 另一个常数可以被认为是在噪声因数之前,作为噪声幅度的一种。

所以最终,它看起来更像是这样的:

y=A×sin(ωx+b)+B×N(μ,σ) y= A \times \sin (\omega x+b)+ B \times N (\mu, \sigma)

在现实生活中,事情的运作方式有所不同。 假设我们固定了一个振幅,但该振幅变化很大。 例如:

  1. 幅度范围为 0.1 到 10,步长 = 0.1

  2. 偏置范围为 0.1 到 10,步长 = 0.1

  3. 频率范围为 1 到 2,步长 = 0.001

  4. 噪声幅度固定为 0.3(噪声的随机性无论如何都在其概率分布中)

如果我们想要合并所有这些随机性,我们可以使用以下代码行来实现:

 import numpy as np
 import matplotlib.pyplot as plt
 X2 = np.linspace(-5,5,LENGTH_INPUT)
 ​
 def generate_sample():
     amps = np.arange(0.1,10,0.1)
     bias = np.arange(0.1,10,0.1)
     freqs = np.linspace(1,2,1000)
     X1 = []
     noise = np.random.normal(size=len(X2))
     picked_amp = np.random.choice(amps)
     picked_freq = np.random.choice(freqs)
     picked_bias = np.random.choice(bias)
     X1=picked_amp*np.sin(X2*picked_freq)+np.random.choice(bias)+0.3*noise
 ​
     params_names = ['Amplitude','Frequency','Bias']
     params = [picked_amp,picked_freq,picked_bias]
     params_list = params_names[0] + ' '+ str(picked_amp.round(1))+ ' ' 
     for p in range(1,len(params)):
         params_list = params_list+params_names[p]+' '+ str(params[p].round(1))+ ' '
     plt.plot(X2,X1,'.')
     plt.title(params_list)
     plt.xlabel('x')
     plt.ylabel('y')

我们使用的机器学习模型是生成对抗网络。生成部分试图生成一个尽可能接近真实模型的模型,那么就和标准的编码器-解码器没有什么不同了,然而现实是有歧义部分。歧义部分是一个分类器,试图区分真实和“假”(由生成模型生成)实例。现在,生成对抗网络最常见的用途是条件生成对抗网络,是与特定输入相关的生成模型。

生成模型是一个 LSTM 模型,它以随机噪声向量(三维向量)作为输入,并输出一个 300 长的向量,理想情况下是所需信号:判别模型区分真实(来自训练数据)和虚假(由生成模型生成)输出。生成对抗网络的实际实现如下:

 from numpy import hstack
 import numpy as np
 from numpy import zeros
 from numpy import ones
 from numpy.random import rand
 from numpy.random import randn
 from keras.models import Sequential
 from keras import Input
 from keras.layers import Dense,LSTM
 from matplotlib import pyplot
 import matplotlib.pyplot as plt 
 ​
 LENGTH_INPUT = 300
 ​
 def define_discriminator(n_inputs=LENGTH_INPUT):
     model = Sequential()
     model.add(Dense(LENGTH_INPUT, activation='relu', input_dim=n_inputs))
     model.add(Dense(250, activation='relu', input_dim=n_inputs))
     model.add(Dense(100, activation='relu'))
     model.add(Dense(1, activation='sigmoid'))
     model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
     return model
 ​
 def define_generator(latent_dim, n_outputs=LENGTH_INPUT):
     model = Sequential()
     model.add(Input(shape=(latent_dim, 1)))
     model.add(LSTM(150))
     model.add(Dense(LENGTH_INPUT, activation='linear'))
     model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mean_absolute_error'])
 ​
     return model
 ​
 def define_gan(generator, discriminator):
     discriminator.trainable = False
     model = Sequential()
     model.add(generator)
     model.add(discriminator)
     model.compile(loss='binary_crossentropy', optimizer='adam')
     return model

现在输入的长度是我们模型的参数:

 LENGHT_INPUT = 300

噪声向量的维度是latent_dim参数。

Last updated