python信号处理必学的20个函数工具和案例代码(1-10)

Python 中进行信号处理的库主要有 Numpy、Scipy 和 Matplotlib。以下是20个常用的信号处理函数:1. Numpy 中的信号生成:`numpy.sin`;2. 傅里叶变换:`numpy.fft.fft`;3. 信号滤波:`scipy.signal.lfilter`;4. 频率响应可视化:`scipy.signal.freqz`;5. 自相关函数:`numpy.correlate`;6. 时域卷积:`numpy.convolve`;7. 频域卷积:`scipy.signal.convolve`;8. 快速傅里叶变换(FFT):`numpy.fft.fft`;9. 滑动窗口平均:`numpy.convolve`;10. 希尔伯特变换:`scipy.signal.hilbert`;

1. Numpy 中的信号生成:`numpy.sin`

import numpy as np

import matplotlib.pyplot as plt



# 生成正弦信号

t = np.linspace(0, 1, 1000)  # 时间从0到1,采样点数为1000

frequency = 5  # 频率为5Hz

signal = np.sin(2 * np.pi * frequency * t)



# 绘制信号图像

plt.plot(t, signal)

plt.title("Sinusoidal Signal")

plt.xlabel("Time (s)")

plt.ylabel("Amplitude")

plt.show()

2. 傅里叶变换:`numpy.fft.fft`

from scipy.fft import fft

import numpy as np

import matplotlib.pyplot as plt



# 生成信号

t = np.linspace(0, 1, 1000)

frequency = 5

signal = np.sin(2 * np.pi * frequency * t)



# 进行傅里叶变换

fft_result = fft(signal)



# 绘制频谱图像

plt.plot(np.abs(fft_result))

plt.title("Frequency Spectrum")

plt.xlabel("Frequency (Hz)")

plt.ylabel("Amplitude")

plt.show()

3. 信号滤波:`scipy.signal.lfilter`

from scipy.signal import lfilter

import numpy as np

import matplotlib.pyplot as plt



# 生成含噪声的信号

t = np.linspace(0, 1, 1000)

frequency = 5

signal = np.sin(2 * np.pi * frequency * t) + 0.5 * np.random.normal(size=len(t))



# 设计滤波器

b = [0.01] * 10  # 滤波器系数

a = 1



# 应用滤波器

filtered_signal = lfilter(b, a, signal)



# 绘制原始信号和滤波后的信号

plt.plot(t, signal, label='Original Signal')

plt.plot(t, filtered_signal, label='Filtered Signal')

plt.title("Signal Filtering")

plt.xlabel("Time (s)")

plt.ylabel("Amplitude")

plt.legend()

plt.show()

4. 频率响应可视化:`scipy.signal.freqz`

from scipy.signal import freqz

import matplotlib.pyplot as plt

# 设计滤波器

b = [0.01] * 10

a = 1

# 计算频率响应

w, h = freqz(b, a)

# 绘制频率响应曲线

plt.plot(w, 20 * np.log10(abs(h)))

plt.title("Frequency Response")

plt.xlabel("Frequency (rad/sample)")

plt.ylabel("Gain (dB)")

plt.show()

5. 自相关函数:`numpy.correlate`

import numpy as np

import matplotlib.pyplot as plt

# 生成信号

t = np.linspace(0, 1, 1000)

signal = np.sin(2 * np.pi * 5 * t)

# 计算自相关函数

auto_corr = np.correlate(signal, signal, mode='full')

# 绘制自相关函数图像

plt.plot(auto_corr)

plt.title("Autocorrelation Function")

plt.xlabel("Lag")

plt.ylabel("Correlation")

plt.show()

6. 时域卷积:`numpy.convolve`

import numpy as np

import matplotlib.pyplot as plt



# 生成两个信号

signal1 = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 100))

signal2 = np.cos(2 * np.pi * 3 * np.linspace(0, 1, 100))



# 计算时域卷积

conv_result = np.convolve(signal1, signal2, mode='full')



# 绘制卷积结果

plt.plot(conv_result)

plt.title("Convolution Result")

plt.xlabel("Time")

plt.ylabel("Amplitude")

plt.show()

7. 频域卷积:`scipy.signal.convolve`

from scipy.signal import convolve

import numpy as np

import matplotlib.pyplot as plt



# 生成两个信号

signal1 = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 100))

signal2 = np.cos(2 * np.pi * 3 * np.linspace(0, 1, 100))



# 计算频域卷积

conv_result = convolve(signal1, signal2, mode='full')



# 绘制卷积结果

plt.plot(conv_result)

plt.title("Convolution Result")

plt.xlabel("Time")

plt.ylabel("Amplitude")

plt.show()

8. 快速傅里叶变换(FFT):`numpy.fft.fft`

import numpy as np

import matplotlib.pyplot as plt



# 生成信号

t = np.linspace(0, 1, 1000)

frequency = 5

signal = np.sin(2 * np.pi * frequency * t)



# 进行傅里叶变换

fft_result = np.fft.fft(signal)



# 绘制频谱图像

plt.plot(np.abs(fft_result))

plt.title("Frequency Spectrum")

plt.xlabel("Frequency (Hz)")

plt.ylabel("Amplitude")

plt.show()

9. 滑动窗口平均:`numpy.convolve`

import numpy as np

import matplotlib.pyplot as plt



# 生成信号

t = np.linspace(0, 1, 1000)

frequency = 5

signal = np.sin(2 * np.pi * frequency * t) + 0.1 * np.random.normal(size=len(t))



# 定义平均窗口

window = np.ones(20) / 20



# 使用卷积进行滑动窗口平均

smooth_signal = np.convolve(signal, window, mode='same')



# 绘制平滑后的信号

plt.plot(t, signal, label='Original Signal')

plt.plot(t, smooth_signal, label='Smoothed Signal')

plt.title("Moving Average Smoothing")

plt.xlabel("Time (s)")

plt.ylabel("Amplitude")

plt.legend()

plt.show()

10. 希尔伯特变换:`scipy.signal.hilbert`

from scipy.signal import hilbert

import numpy as np

import matplotlib.pyplot as plt



# 生成信号

t = np.linspace(0, 1, 1000)

frequency = 5

signal = np.sin(2 * np.pi * frequency * t)



# 进行希尔伯特变换

analytic_signal = hilbert(signal)



# 提取包络

envelope = np.abs(analytic_signal)



# 绘制原始信号和包络

plt.plot(t, signal, label='Original Signal')

plt.plot(t, envelope, label='Envelope')

plt.title("Hilbert Transform")

plt.xlabel("Time (s)")

plt.ylabel("Amplitude")

plt.legend()

plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值