Спектр мощности, метод Уэлча и оконные функции - PullRequest
1 голос
/ 20 июня 2019

Мне нужно найти спектр мощности сигнала, применяя метод Уэлча. Затем, используя окна Чебышева, Кайзера и Гаусса, найдите лучшее окно с точки зрения разделения частот.

Я написал функцию, которая генерирует зашумленный синусоидальный сигнал, и использовал для этого сигнала метод Уэлча, а также сгенерировал все эти три оконные функции.

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

def sig_noise(f,snr,n):
    fs=1000
    dt=1/fs
    tk=n*dt
    A=1
    B=10**(-snr/20)
    t=np.arange(0,tk,dt)
    y=(np.random.rand(n)-0.5)
    z=A*np.sin(2*np.pi*f*t)+B*y
    return z,t

[s,t]=sig_noise(140,-10,64)

f, Pxx_den = sg.welch(s,nperseg=64,noverlap=None) # Welch method, parameters are taken from book

plt.plot(f,Pxx_den)
plt.xlabel("Frequency")
plt.grid()

plt.figure(figsize=(10,10))

chebyshev=sg.chebwin=(64,40) # Chebyshev window

kaiser=sg.kaiser(64,0) # Kaiser window

gauss=sg.gaussian(64,np.std((f,Pxx_den),ddof=0)) # Gauss window

# plots for check

plt.subplot(221)
plt.grid()
plt.title("Gauss")
plt.plot(gauss)
plt.subplot(222)
plt.grid()
plt.title("Chebyshev")
plt.plot(chebyshev)
plt.subplot(223)
plt.grid()
plt.title("Kaiser")
plt.plot(kaiser)

f, Pxx_den = sg.welch(s,nperseg=64,noverlap=None,window=chebyshev)

последняя строка кода не работает, так как я хочу использовать, например, окно чебышева. Неизвестный тип окна - это то, что я получаю в качестве ответа. Может ли кто-нибудь сказать мне, где ошибка?

1 Ответ

0 голосов
/ 20 июня 2019

Проблема с дополнительным символом = в следующей строке:

chebyshev=sg.chebwin=(64,40) # Chebyshev window
#                  ^^^
#                  extra "=" character

Это заставляет chebyshev быть равным кортежу (64,40), а не предполагаемому массиву (следуя тому же подходу, что и для других ваших окон). Позже, когда в качестве аргумента окна указан кортеж, scipy.signal.welch пытается создать окно, вызывая scipy.signal.get_window для типа окна, указанного в первом элементе кортежа. Очевидно, 64 (первый элемент кортежа в вашем случае) не является допустимым типом окна.

Итак, исправление состоит в том, чтобы просто исправить опечатку:

chebyshev=sg.chebwin(64,40) # Chebyshev window

или, альтернативно, вызовите welch с правильно составленным кортежем:

f, Pxx_den = sg.welch(s,nperseg=64,noverlap=None,window=('chebwin',40)
...