简单的窗口化 DFT 代码 -ValueError:使用序列设置数组元素

问题描述

我希望为我的作业制作简单的代码窗口 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,1)
noise = np.random.normal(0,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.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)