Advertisement
Guest User

Untitled

a guest
Apr 7th, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.signal import ricker, firwin, filtfilt
  4.  
  5. # 生成Ricker子波
  6. fs = 500 # 采样率
  7. T = 0.5 # 信号时长(秒)
  8. n = int(T * fs)
  9. t = np.linspace(-0.25, 0.25, n, endpoint=False)
  10. f_peak = 10 # 主频10Hz
  11. ricker_wavelet = ricker(n, f_peak * T / 2)
  12. ricker_wavelet = ricker_wavelet / np.max(np.abs(ricker_wavelet)) # 归一化
  13.  
  14. # 设计高通滤波器
  15. cutoff = 5 # 截止频率
  16. numtaps = 101 # 滤波器阶数
  17. taps = firwin(numtaps, cutoff, pass_zero='highpass', fs=fs)
  18.  
  19. # 零相位滤波
  20. filtered = filtfilt(taps, 1.0, ricker_wavelet)
  21.  
  22. # 截断至原支集范围(示例:中心附近)
  23. window = np.zeros_like(filtered)
  24. win_len = len(ricker_wavelet) // 4 # 假设原支集为总长的1/4
  25. center = len(filtered) // 2
  26. window[center - win_len//2 : center + win_len//2] = 1
  27. filtered_windowed = filtered * window
  28.  
  29. # 绘图比较
  30. plt.figure()
  31. plt.plot(t, ricker_wavelet, label='Original')
  32. plt.plot(t, filtered_windowed, label='Filtered')
  33. plt.legend()
  34. plt.title('Time Domain')
  35. plt.xlabel('Time (s)')
  36.  
  37. # 频谱比较
  38. fft_orig = np.fft.fft(ricker_wavelet)
  39. fft_filt = np.fft.fft(filtered_windowed)
  40. freq = np.fft.fftfreq(n, d=1/fs)
  41. plt.figure()
  42. plt.semilogy(freq[:n//2], np.abs(fft_orig[:n//2]), label='Original')
  43. plt.semilogy(freq[:n//2], np.abs(fft_filt[:n//2]), label='Filtered')
  44. plt.xlim(0, 20)
  45. plt.axvline(5, color='red', linestyle='--', label='5Hz')
  46. plt.legend()
  47. plt.title('Frequency Domain')
  48. plt.xlabel('Frequency (Hz)')
  49. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement