|
- import numpy as np
- import math
- import matplotlib.pyplot as plt
- from matplotlib.pylab import mpl
- from scipy.fftpack import fft, ifft, fftshift
- import scipy
- import sympy
- # https://www.jianshu.com/p/339c91ae9f41
- mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
- mpl.rcParams['axes.unicode_minus'] = False # 显示负号
- # lfm:线性调频信号的生成与幅频特性
- # 线性调频(LFM)是一种不需要伪随机编码序列的扩展频谱调制技术。
- # 由于线性调频信号占用的频带宽度远大于信息带宽,所以也可以获得很大的系统处理增益。
- # 线性调频信号又称鸟声(Chirp)信号,因为其频谱带宽落于可听范围,则听若鸟声,所以又称Chirp扩展频谱(CSS)技术。
- # LFM技术在雷达、声纳技术中有广泛应用,如在雷达定位技术中,
- # 它可在增大射频脉冲宽度、提高平均发射功率、加大通信距离同时又保持足够的信号频谱宽度,不降低雷达的距离分辨率
- # 脉冲压缩雷达最常见的调制信号是线性调频(Linear Frequency Modulation)信号
- # 脉冲信号:脉宽 峰值功率 平均功率
- T = 10e-6 # 脉宽
- # 把一个信号所包含谐波的最高频率与最低频率之差,即该信号所拥有的频率范围,定义为该信号的带宽。
- # 因此可以说,信号的频率变化范围越大,信号的带宽就越宽
- B = 23e6 # 信号带宽
- # 线性调频信号的调频斜率估计方法 y=kx+b里的k
- K = B/T # 调频斜率
- Fs = 2*B # 采样频率 数字信号处理
- Ts = 1 / Fs # 采样周期
- N = int(T / Ts) # 脉冲宽度里有多少个周期 一个周期一个采样点
- # 采样个数: 460.0
- print("脉冲宽度里有多少个周期(采样点个数):", N)
- t = np.linspace(-T/2, T/2, N)
- # 生成线性调频信号 这也是sin cos的波?
- # St = np.exp(j * np.pi * K * t**2) j是虚数单位
- # 欧拉公式展开
- # # 可以将把 St 表示成一个实部cos(PI*K*t*t)和一个虚部sin(PI*K*t*t)
- # # St = np.cos(np.pi * K * t**2) + np.sin(np.pi * K * t**2)j j是虚数单位 这样写也不行
- # St_temp = []
- # for t_i in t:
- # St_temp.append(complex(np.cos(np.pi * K * t_i**2), np.sin(np.pi * K * t_i**2)))
- #
- # St = np.array(St_temp)
- St = np.exp(1j * np.pi * K * t**2)
- print("成功构建了射频信号:", type(St), St.shape, St.dtype, St[:5])
- # 复数信号都可以这样分解,如果 不懂的话, 可以 找找信号 与系统方面的书看一看
- # 虚数部分必须有后缀j或J i被电流占用
- # sympy.exp()
- # print(type(St))
- # 复数由实数部分和虚数部分构成 x+yj real+imagej
- # aa = 123 - 12j
- # yreal = aa.real # 获取实数部分
- # yimag = aa.imag # 获取虚数部分
- # 实数部分和虚数部分都是浮点数 虚数部分必须有后缀j或J
- # 画图
- plt.figure(figsize=(16, 12))
- plt.subplot(211)
- # 为何乘以1e6 时间的单位变了(由秒 变 U秒)
- plt.plot(t*1e6, St, linestyle='-', color='blue')
- plt.xlabel('Time [u sec]', fontsize=16)
- plt.xticks()
- # Amplitude 振幅
- plt.ylabel('Amplitude', fontsize=16)
- plt.title("线性调频信号(LFM Chirp)", fontsize=16)
- # plt.show()
- plt.subplot(212)
- freq = np.linspace(-Fs/2, Fs/2, N)
- fft_values_ = fft(St)
- # 振幅
- fft_values = np.abs(fft_values_)
- fft_values = fftshift(fft_values)
- # fftshift(abs(fft(St)))
- # 频率单位是hz 变换单位 MHZ
- plt.plot(freq*1e-6, fft_values, linestyle='-', color='blue')
- plt.xlabel('Frequency in MHz', fontsize=16)
- plt.ylabel('Amplitude', fontsize=16)
- plt.title("线性调频信号的幅频特性", fontsize=16)
- plt.show()
复制代码
|
|