sinc卷积代码
时间: 2023-07-02 12:05:08 浏览: 151
以下是一个简单的Sinc卷积的代码示例,使用Python中的NumPy库实现:
```python
import numpy as np
def sinc(x):
if x == 0:
return 1.0
else:
return np.sin(x) / x
def sinc_kernel(n, fc):
h = np.zeros(n)
for i in range(n):
if i - n/2 == 0:
h[i] = 2 * np.pi * fc
else:
h[i] = np.sin(2 * np.pi * fc * (i - n/2)) / (i - n/2)
return h / np.sum(h)
def convolve(x, h):
n = len(x)
m = len(h)
y = np.zeros(n+m-1)
for i in range(n+m-1):
for j in range(m):
if i-j >= 0 and i-j < n:
y[i] += x[i-j] * h[j]
return y
# 构造信号
x = np.arange(0, 10, 0.1)
y = np.sin(2 * np.pi * 2 * x)
# 构造Sinc滤波器
fc = 0.2 # 截止频率
n = 101 # 滤波器长度
h = sinc_kernel(n, fc)
# 进行卷积
y_filtered = convolve(y, h)
# 绘制结果
import matplotlib.pyplot as plt
plt.plot(x, y, label='Original signal')
plt.plot(x, y_filtered[n//2:-n//2], label='Filtered signal')
plt.legend()
plt.show()
```
在上述代码中,我们首先定义了一个Sinc函数`sinc(x)`,用于生成滤波器的核。接着,我们定义了一个`sinc_kernel(n, fc)`函数,用于生成一个长度为`n`,截止频率为`fc`的Sinc滤波器。最后,我们通过`convolve(x, h)`函数实现卷积操作,并绘制了原始信号和滤波后的信号。
需要注意的是,在实际应用中,我们可能需要对Sinc滤波器进行窗函数加窗等处理,以避免频谱泄漏等问题。
阅读全文