#python #arrays #numpy #dft #windowing
Вопрос:
Я ожидал, что сделаю простой код, оконный DFT для моего задания, но, я думаю, у меня проблема с формированием сигнала DFT realX[k]
и imj[k]
. Вот мой код ниже:
import numpy as np
import matplotlib.pyplot as plt
import random
realX = np.ones(100000)
imjX = np.ones(100000)
magX = np.ones(100000)
A1 = int(input('Amplitude A1: '))
A2 = int(input('Amplitude A2: '))
f1 = int(input('Frequency f1: '))
f2 = int(input('Frequency f2: '))
N = int(input('Number of sequence: '))
fs = int(input('Sampling Frequency:'))
n = np.linspace(0, N, 10000).reshape(-1,1)
k = np.linspace(0, N/2, 10000).reshape(-1,1)
noise = np.random.normal(0,1,10000).reshape(-1,1)
xn = A1*np.cos(2*np.pi*f1*n/fs) A2*np.sin(2*np.pi*f2*n/fs) noise
print(xn)
print("Window Funtion: n")
print("1. Rectangular Window (Wrec(n)) n")
print("2. Tringular(Barlett) Window (Wtri(n)) n")
print("3. Hanning Window (Whan(n)) n")
print('4. Hamming Window (Wham(n)) n')
print('5. Blackman Window (Wblack(n)) n')
wd = input('Choose Window Funtion: ')
if wd == '1':
def wn(n):
return 1
elif wd == '2':
def wn(n):
return 1-abs((2*n-N)/N)
elif wd == '3':
def wn(n):
return 0.5 - 0.5*np.cos(2*np.pi*n/N)
elif wd == '4':
def wn(n):
return 0.54 - 0.46*np.cos(2*n*np.pi/N)
elif wd == '5':
def wn(n):
return 0.42 - 0.5*np.cos(2*n*np.pi/N) 0.08*np.cos(4*n*np.pi/N)
else:
print('Invalid Input')
def window(n):
return xn*wn(n)
print(window(n))
for k in range(N):
for n in range(N):
realX[k] = window(n)*np.cos(2*np.pi*k*n/N)
imjX[k] -= window(n)*np.sin(2*np.pi*k*n/N)
for k in range(N):
magX[k] = np.sqrt((realX[k])**2 (imjX[k])**2)
plt.plot(n/fs, xn)
plt.show()
plt.plot(n/fs, window())
plt.show()
plt.bar(k*fs/N,magX[k],width=0.5)
plt.show()
Когда я запускаю этот код и данные, я получил некоторую ошибку ниже. Итак, как я могу легко исправить эту ошибку?
TypeError Traceback (most recent call last)
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
<ipython-input-5-9457d8079e12> in <module>()
49 for k in range(N):
50 for n in range(N):
---> 51 realX[k] = window(n)*np.cos(2*np.pi*k*n/N)
52 imjX[k] -= window(n)*np.sin(2*np.pi*k*n/N)
53
ValueError: setting an array element with a sequence.
Комментарии:
1. window(n) возвращает массив, который является результатом умножения массива » xn «на скаляр» wn(n)». Вы не можете втиснуть массив вместо одного значения в массиве numpy.