Простой оконный код DFT-ошибка значения: установка элемента массива с последовательностью

#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.