【问题标题】:convolution algorithm for data smoothing用于数据平滑的卷积算法
【发布时间】:2020-01-29 13:47:17
【问题描述】:

所以我决定编写自己的卷积来平滑我的数据,这与np.convolve 的作用相同。唯一的问题是我得到的幅度比我预期的要高一点。我不知道我应该在哪一部分划分数据才能得到正确的结果。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

def dotProduct(a,b):
    dot = 0
    if (len(a) == len(b)):
        for i in range(len(a)):
            dot += a[i] * b[i]
    elif (len(a) > len(b)):
        for i in range(len(b)):
            dot += a[i] * b[i]
    elif (len(b) > len(a)):
        for i in range(len(a)):
            dot += a[i] * b[i]

    return dot


def convolution(signal,magnitude=3):
    kernel = np.linspace(0,1,4) * magnitude
    convolution = np.zeros(len(signal))
    sameSizeKernel = np.zeros(len(signal))
    for i in range(len(convolution)):
        if ((len(kernel)+i) <= len(convolution)):
            sameSizeKernel[i:len(kernel)+i] = kernel
            convolution[i+int(len(kernel)/2)] = dotProduct(signal,sameSizeKernel)/4
        else:
            kernel = kernel[:len(kernel)-1]
            sameSizeKernel[i:len(kernel)+i] = kernel
            convolution[i+int(len(kernel)/2)] = dotProduct(signal,sameSizeKernel)/4
    return convolution


t = np.linspace(0, 1, 500)
triangle = signal.sawtooth(2 * np.pi * 5 * t, 0.5)
conv_ = convolution(triangle,10)

plt.figure(figsize=(15,8))
plt.plot(triangle, label='signal')
plt.plot(conv_, label='convolution')
plt.legend(loc=1)

【问题讨论】:

    标签: python numpy signal-processing convolution


    【解决方案1】:

    所以我自己找到了答案:) 问题是,如果您想看到正确的结果,内核数组的总和最多不超过 1。因此,对于标准化,我们应该将每个点除以内核索引的总和。

    convolution[i+int(len(kernel)/2)] = dotProduct(signal,sameSizeKernel)/np.sum(kernel)
    

    完整代码在这里:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import signal
    
    def dotProduct(a,b):
        dot = 0
        if (len(a) == len(b)):
            for i in range(len(a)):
                dot += a[i] * b[i]
        elif (len(a) > len(b)):
            for i in range(len(b)):
                dot += a[i] * b[i]
        elif (len(b) > len(a)):
            for i in range(len(a)):
                dot += a[i] * b[i]
    
        return dot
    
    dotProduct(a,b)
    
    def convolution(signal,magnitude=3):
        kernel = np.linspace(0,magnitude,10)
        convolution = np.zeros(len(signal))
        sameSizeKernel = np.zeros(len(signal))
        for i in range(len(convolution)):
            if ((len(kernel)+i) <= len(convolution)):
                sameSizeKernel[i:len(kernel)+i] = kernel
                convolution[i+int(len(kernel)/2)] = dotProduct(signal,sameSizeKernel)/np.sum(kernel)
            else:
                kernel = kernel[:len(kernel)-1]
                sameSizeKernel[i:len(kernel)+i] = kernel
                convolution[i+int(len(kernel)/2)] = dotProduct(signal,sameSizeKernel)/np.sum(kernel)
        return convolution
    
    
    t = np.linspace(0, 1, 50)
    triangle = np.zeros(len(t))
    triangle[10:20] = 10
    conv_ = convolution(triangle,10)
    
    plt.figure(figsize=(15,8))
    plt.plot(triangle, label='signal')
    plt.plot(conv_, label='convolution')
    plt.legend(loc=1)
    
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多