Python学习之np.random.normal()函数

       这是的np是numpy包的缩写,np.random.normal()的意思是一个正态分布,normal这里是正态的意思。我在看孪生网络的时候看到这样的一个例子:numpy.random.normal(loc=0,scale=1e-2,size=shape) ,意义如下:

  1. 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,
  2. 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
  3. 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。

import numpy as np import scipy.signal as signal import matplotlib.pyplot as plt import scipy.fftpack as fftpack import time def generatesignal(t,freqs,amps,phases,SNR): """ 根据指定的频率、幅度、相位、信噪比等参数生成信号片段 :param t: 生成信号的时间序列 :param freqs: 生成信号的频率参数,多个成分以列表形式组织 :param amps: 生成信号的幅度参数,多个成分以列表形式组织 :param phases: 生成信号的相位参数,多个成分以列表形式组织 :param SNR: 生成信号的高斯噪声信噪比参数 :return: 生成的信号片段 """ t = np.array(1) sig = np.zeros(np.shape(t)) for freq,amp,phase in zip(freqs,amps,phases): sig = sig + amp*np.sin(2*np.pi*freq*t+phase) noise = np.random.normal(loc = 0, scale = 1/np.exp(SNR/10),size = np.shape(t)) sig = sig + noise return sig def signalProcessByCon(sig,h,mode='same',method = None): """ 通过不同卷积方式实现FIR滤波器滤波功能 :param sig: 待处理信号 :param h: FIR滤波器单位脉冲响应 :param mode: 卷积输出类型 :param method: 卷积计算方法 :return: 返回滤波结果和卷积运算时间 """ start_time = time.time() if method is None: y = signal.convolve(sig,h,mode = mode, method = 'auto') elif method == 'overlap_add': y = signal.oaconvolve(sig,h,mode = mode) else: y = signal.convolve(sig,h,mode=mode,method = method) end_time = time.time() return y,end_time-start_time def drawSignalCur(tim,sig): """ 画出信号时域波形 :param tim: 信号片段的时间坐标 :param sig: 信号片段值 :return: 无返回值 """ plt.figure(figsize=(10, 4)) plt.plot(tim, sig) plt.xlabel('Time[s]') plt.ylabel('Amp') plt.title('Signal') plt.grid() plt.show() def drawspecrum(sig,Fs): """ 画出信号的频谱,包括幅度谱和相位谱 :param sig: 需要绘制的信号片段 :param Fs: 信号采样频率 :return: 无返回值 """ hs = fftpack.rfft(sig) dur = 1.0/Fs num = len(sig) fs = fftpack.rfftfreq(num,dur) fig = plt.figure(figsize=(10, 6)) # Plot Magnitude response sub1 = plt.subplot(2, 1, 1) sub1.plot(fs, np.abs(hs), 'r', linewidth=2) sub1.set_title('Magnitude Response', fontsize=20) sub1.set_xlabel('Frequency [Hz]', font
最新发布
04-03
<think>好的,用户想了解Pythonnumpy、scipy和matplotlib在信号生成与处理方面的功能及实现细节。首先,我需要整理这三个库在信号处理中的常见用法。 首先,numpy主要负责数组操作和基础数学函数,比如生成正弦波、方波等基本信号。用户可能想知道如何用numpy生成这些信号,并了解相关参数的意义。例如,生成正弦波需要频率、振幅、采样率等参数,代码中可以用numpy.linspace创建时间点数组,再用numpy.sin生成波形。 接下来是scipy,它提供了更高级的信号处理函数,比如滤波、频谱分析等。这里需要提到scipy.signal模块,里面的butter函数可以设计滤波器,使用lfilter进行滤波应用。用户可能需要了解如何设计低通或高通滤波器,以及如何应用到生成的信号上。 然后是matplotlib,用于可视化信号和处理结果。用户可能需要绘制时域图和频谱图,使用matplotlib.pyplot的子图功能来展示多个图表。例如,用plt.subplot创建多个子图,分别显示原始信号、滤波后的信号和频谱变化。 还需要注意代码示例的完整性,比如生成混合信号,添加噪声,然后进行滤波和频谱分析。同时,要解释每个步骤的作用,比如傅里叶变换如何将时域信号转为频域,以及滤波器如何去除噪声。 另外,用户可能对性能优化感兴趣,比如numpy的向量化操作如何提升速度,或者如何选择合适的采样率避免混叠。这些问题可以作为相关问题的补充,帮助用户深入理解。 还要检查是否有需要引用的地方,比如傅里叶变换的实现引用numpy.fft,滤波部分引用scipy.signal的相关函数。确保引用标识正确,如引用[3]提到numpy的科学运算功能,引用[2]说明matplotlib的绘图特性。 最后,确保回答结构清晰,分点讲解每个库的功能,配合代码示例和图表说明,帮助用户逐步理解信号处理的流程。可能的相关问题包括性能优化、高级滤波方法、实时信号处理等,扩展用户的学习路径。</think>### Python信号处理库功能详解 #### 一、Numpy信号生成 Numpy主要提供基础数学运算和数组操作能力,其信号生成函数集中在$numpy.random$和数学计算模块: 1. **基础波形生成**: ```python import numpy as np # 生成正弦波 t = np.linspace(0, 1, 1000) # 时间轴(总时长1秒,1000个采样点) frequency = 5 # 赫兹 amplitude = 2 sine_wave = amplitude * np.sin(2 * np.pi * frequency * t) # 生成方波 square_wave = amplitude * np.sign(np.sin(2 * np.pi * frequency * t)) ``` 生成原理:通过时间轴数组与三角函数运算产生周期性波形,采样率由$linspace$第三个参数控制[^3] 2. **噪声信号生成**: ```python # 高斯白噪声 noise = np.random.normal(0, 0.5, 1000) # (均值, 标准差, 样本数) # 脉冲噪声 impulse = np.zeros(1000) impulse[::50] = 1 # 每50个样本产生一个脉冲 ``` #### 二、Scipy信号处理 Scipy提供专业级数字信号处理工具,核心功能在$scipy.signal$模块: ```python from scipy import signal import matplotlib.pyplot as plt # 设计10阶巴特沃斯低通滤波器 order = 10 cutoff_freq = 15 # 截止频率 b, a = signal.butter(order, cutoff_freq/(fs/2), 'low') # fs为采样率 # 应用滤波器 filtered_signal = signal.lfilter(b, a, noisy_signal) # 频谱分析 freq, spectrum = signal.welch(signal_data, fs=1000) ``` 滤波器设计原理:通过双线性变换将模拟滤波器转换为数字滤波器,$butter()$函数返回传递函数的分子分母系数 #### 三、Matplotlib可视化 可视化是信号处理的重要验证手段: ```python # 创建2x2子图布局 fig, axs = plt.subplots(2, 2, figsize=(12,8)) # 原始信号时域图 axs[0,0].plot(t, raw_signal) axs[0,0].set_title('时域波形') # 频域分析 magnitude = np.abs(np.fft.fft(raw_signal)) freqs = np.fft.fftfreq(len(raw_signal), 1/fs) axs[0,1].plot(freqs[:500], magnitude[:500]) # 显示前500个频率分量 # 显示滤波器特性 w, h = signal.freqz(b, a) axs[1,0].plot(w, 20 * np.log10(abs(h))) # 添加标注 axs[1,1].specgram(filtered_signal, Fs=fs) ``` 该代码段使用subplots创建多视图仪表盘,包含时域、频域、滤波器特性和时频分析四个视角[^2] #### 四、完整处理流程示例 ```python # 生成含噪声的混合信号 fs = 1000 # 采样率 t = np.linspace(0, 2, 2*fs) signal_clean = 3*np.sin(2*np.pi*20*t) + 0.5*np.cos(2*np.pi*80*t) noise = 0.8*np.random.normal(size=len(t)) signal_noisy = signal_clean + noise # 设计带通滤波器 b, a = signal.butter(8, [15/(fs/2), 60/(fs/2)], btype='bandpass') # 零相位滤波 filtered = signal.filtfilt(b, a, signal_noisy) # 频谱对比 f_orig, P_orig = signal.welch(signal_clean, fs) f_filt, P_filt = signal.welch(filtered, fs) ``` 该示例展示了从信号合成到滤波处理的完整链路,使用$filtfilt()$实现零相位延迟滤波
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值