【问题标题】:find peaks in spectrum and delete them - python在光谱中找到峰值并删除它们 - python
【发布时间】:2021-05-06 09:20:15
【问题描述】:

我得到了以下代码来识别峰值。

Frequency = [ 5.0, 6.3, 8.0, 10.0, 12.5, 16.0, 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0, 100.0, 125.0, 160.0, 200.0, 250.0, 315.0] #third octave band spectrum, 19 Values
Spec = [ 40, 45, 51, 42, 44, 56, 42, 55, 57, 58, 45, 40, 38, 36, 32, 30, 28, 30, 29] #noise level, 19 Values
peaks, _ = find_peaks(Spec, prominence=1)
plt.plot(Frequency[peaks], Spec[peaks], "xr"); plt.plot(Frequency, Spec); plt.legend(['prominence'])
plt.tight_layout()
plt.show()
print( [(i,j) for i, j in zip(Frequency[peaks], Spec[peaks] )] )

代码运行良好。下一个目标是识别峰值并将它们从光谱中删除,以便我可以平滑曲线。有人有解决这个问题的想法吗?

感谢您的帮助

【问题讨论】:

    标签: python matplotlib signal-processing


    【解决方案1】:

    创建一个布尔数组m来选择所有不在索引数组peaks中的元素:

    import matplotlib.pyplot as plt
    from scipy.signal import find_peaks
    import numpy as np
    
    Frequency = np.array([ 5.0, 6.3, 8.0, 10.0, 12.5, 16.0, 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0, 100.0, 125.0, 160.0, 200.0, 250.0, 315.0]) #third octave band spectrum, 19 Values
    Spec = np.array([ 40, 45, 51, 42, 44, 56, 42, 55, 57, 58, 45, 40, 38, 36, 32, 30, 28, 30, 29]) #noise level, 19 Values
    
    peaks, _ = find_peaks(Spec, prominence=1)
    m = np.zeros(Frequency.shape, dtype=bool)
    m[peaks] = True
    
    plt.plot(Frequency[peaks], Spec[peaks], "xr", label="prominence")
    plt.plot(Frequency, Spec, label="original")
    plt.plot(Frequency[~m], Spec[~m], label="'smoothed'")
    plt.legend() 
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 谢谢。这样可行。是否可以比较 Spec 和 Spec[~m]?因为他们现在有了不同的 len (15,19)。我需要原始规格和新规格中每个中频的差异噪声级。感谢您的帮助!
    • IIUC 你想得到new_spec = np.interp(Frequency, Frequency[~m], Spec[~m]) 这样你就可以做Spec-new_spec
    猜你喜欢
    • 2018-06-16
    • 2019-10-04
    • 2014-08-30
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多