数字信号内插方法的python实现

内插指的是增加数字信号采样率的方法。
步骤:
1. 插入零值样本(即在所需要插值的地方插入0)
2. 低通滤波器滤波
–来自:理查德G.莱昂斯, D.李・富盖尔, RichardG.Lyons,等. 数字信号处理精要[M]. 机械工业出版社, 2016.

但是我发现这种方法会导致信号的幅值改变。n倍内插相当于把幅值缩小了n倍。所以应该加入第3个步骤:n倍内插在滤波之后信号的幅值乘n。

import numpy as np
import math
import scipy.signal as signal
import pylab as pl
import matplotlib.pyplot as plt

sampling_rate=1000 # 采样率设置为1000Hz,内插之前的采样率为333Hz
t1=np.arange(0, 1.0, 1.0/sampling_rate) # 时间长度为1s
x1=np.sin(15.4*np.pi*t1)*8.9+np.sin(31*np.pi*t1)*35.9+np.sin(56*np.pi*t1)*29.3
plt.figure(figsize=(16,4))
plt.plot(t1,x1)
plt.plot(t1,x1, '*')
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第1张图片

# x2 为内插之前的数据
t2=t1[::3]
x2=x1[::3]
plt.figure(figsize=(16,4))
plt.plot(t2,x2,"*")
plt.plot(t2,x2)
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第2张图片

# x3 为零值内插修改后的数字信号
x3=x1.copy()
x3[1::3]=0;
x3[2::3]=0;
plt.figure(figsize=(16,4))
plt.plot(t1,x3,"*")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第3张图片

# 放大局部信号
plt.figure(figsize=(16,4))
plt.plot(t1,x3,"*")
plt.xlim(0,0.1)
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第4张图片

# 滤波器设置
b,a=signal.iirdesign(0.08, 0.1, 1, 40)
# x4 为低通滤波器滤波之后的数字信号
x4 = signal.filtfilt(b, a, x3)
plt.figure(figsize=(16,4))
plt.plot(t1,x4)
plt.plot(t1,x4,"*")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第5张图片

# 蓝色为理论信号,红色为经过插值前两步之后的信号
plt.figure(figsize=(16,4))
plt.plot(t1,x1)
plt.plot(t1,x4,'r--')
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第6张图片
可见滤波之后的信号幅值很大程度上被改变了。

# 蓝色为理论信号,红色为插值之后的信号
plt.figure(figsize=(16,4))
plt.plot(t1,x1)
plt.plot(t1,3*x4,'r--')
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.legend()
plt.show()

数字信号内插方法的python实现_第7张图片
结论:
信号的零值内插方法需要经过三个步骤:
1. 插入零值样本(即在所需要插值的地方插入0)
2. 低通滤波器滤波
3. 针对 n 倍内插每个信号值扩大 n 倍

你可能感兴趣的:(算法)