|
# 时域信号加窗与窗函数的作用 通过加窗,可以减少频谱的泄露
# 时域加窗:主瓣变宽(距离分辨率下降?),幅值变小(信噪比降低)
- # -*- coding: utf-8 -*-
- __author__ = u'东方耀 微信:dfy_88888'
- __date__ = '2021/9/1 上午9:57'
- __product__ = 'PyCharm'
- __filename__ = '21_信号处理demo'
- from scipy.fftpack import fft, ifft, fftshift
- from scipy.signal import findfreqs, find_peaks
- import numpy as np
- import scipy
- from scipy.signal import get_window
- import matplotlib.pyplot as plt
- import matplotlib.ticker as mticker
- from matplotlib.font_manager import FontProperties
- font_fname = "/usr/share/fonts/wps-office/simfang.ttf"
- font = FontProperties(fname=font_fname)
- # plt.rcParams['font.sans-serif']=['simfang']#设置作图中文显示
- # 时域信号加窗与窗函数的作用 通过加窗,可以减少频谱的泄露
- # 时域加窗:主瓣变宽(距离分辨率下降?),幅值变小(信噪比降低)
- continue_time_per_freq = 1e-6 # 每个频点的持续时间1微妙
- fs = 100e6 # 时间维 采样率 100M
- f = 10e6 # 信号频率 10M
- sample_num_per_freq = int(np.ceil(continue_time_per_freq * fs))
- print("每个子脉冲的采样点数(采样速率和脉宽有关)=", sample_num_per_freq)
- # 发信号
- x_time = np.linspace(0, continue_time_per_freq, sample_num_per_freq, endpoint=True)
- print("每个频段的时间采样点数=", len(x_time), x_time[:2], x_time[-2:])
- # 离散后就没有时间的概念了 发送复信号
- Tx_signal = 1 * np.cos(2*np.pi*f*x_time)
- print("发送cos实信号:", len(Tx_signal), type(Tx_signal[0]))
- # 发送信号fft 将零频分量移动到数组中心
- Tx_y_fft = fftshift(fft(Tx_signal))
- print("发射信号作fft之后:", len(Tx_y_fft))
- # 频域的X轴 参考gnuradio的 一般为(-fs/2,fs/2)
- # 取一半 因为 振幅谱 是偶函数 相位谱 是奇函数
- # 复序列没有负频率,采样率只要大于带宽即可
- x_f = np.linspace(0, int(fs), len(Tx_signal), endpoint=True) - int(fs/2)
- Tx_abs_y = np.abs(Tx_y_fft) # 取复数的绝对值,即复数的模(双边频谱)
- # 矩形窗boxcar hamming hann blackmanharris blackman gaussian
- window_name = "hamming"
- window = get_window(window_name, sample_num_per_freq)
- print("生成窗%s函数的序列:" % window_name, len(window), window[:3], window[-3:])
- # assert 0 == 1, "stop"
- # 这里的 len(window) == 300 != 2048也是可以的
- window_y_fft = np.abs(fftshift(fft(window, 2048)))
- print("看看改变了频点的fft变换后:", len(window_y_fft))
- x_f_window = np.linspace(-0.5, 0.5, len(window_y_fft))
- # 注意 x_f_window的取值范围 和 fftshift的使用 导致0频分量已经放到坐标原点了
- window_y_fft_db = 20 * np.log10(window_y_fft / np.max(window_y_fft))
- # 进行加窗操作
- windowed_signal = Tx_signal * window
- windowed_y_fft = np.abs(fftshift(fft(windowed_signal)))
- # 画图展示
- plt.figure(figsize=(14, 12))
- # seen_point_num = 600 # 刚好是2个子脉冲的 600=2*300 sample_num_per_freq
- plt.figure(1)
- plt.subplot(2, 2, 1)
- plt.plot(np.arange(sample_num_per_freq), Tx_signal, marker='o', markersize=6, markerfacecolor='r')
- plt.title('发射信号_时域(实信号)', fontproperties=font, fontsize=16)
- # plt.axis([0, 500, -3, 3])
- plt.xlabel('time/sample_num')
- # plt.subplot(2, 3, 2)
- # plt.plot(Tx_signal.imag[:seen_point_num], marker='o', markersize=8, markerfacecolor='r')
- # plt.title('发射信号(虚部)', fontproperties=font, fontsize=16)
- # # plt.axis([0, 500, -3, 3])
- # plt.xlabel('time')
- plt.subplot(2, 2, 2)
- plt.plot(x_f, Tx_abs_y, 'blue')
- plt.title('发射信号的幅度谱(未归一化)', fontproperties=font, fontsize=16)
- plt.xlabel('freq')
- plt.subplot(2, 2, 3)
- plt.plot(np.arange(sample_num_per_freq), window, marker='o', markersize=6, markerfacecolor='r')
- plt.title('%s窗' % window_name, fontproperties=font, fontsize=16)
- plt.xlabel('time/sample_num')
- plt.subplot(2, 2, 4)
- # plt.plot(x_f, window_y_fft, 'blue')
- plt.plot(x_f_window, window_y_fft_db, 'blue')
- plt.title('窗的幅度谱(db)', fontproperties=font, fontsize=16)
- plt.xlabel('freq')
- plt.figure(2)
- plt.subplot(2, 1, 1)
- plt.plot(np.arange(sample_num_per_freq), windowed_signal, marker='o', markersize=6, markerfacecolor='r')
- plt.title('加窗%s信号_时域(实信号)' % window_name, fontproperties=font, fontsize=16)
- # plt.axis([0, 500, -3, 3])
- plt.xlabel('time/sample_num')
- plt.subplot(2, 1, 2)
- plt.plot(x_f, windowed_y_fft, 'blue')
- plt.title('加窗%s信号的幅度谱(未归一化)' % window_name, fontproperties=font, fontsize=16)
- plt.xlabel('freq')
- plt.show()
复制代码
|
|