Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:计算信号的最大傅里叶系数_Python_Numpy_Signal Processing_Fft_Frequency Analysis - Fatal编程技术网

Python:计算信号的最大傅里叶系数

Python:计算信号的最大傅里叶系数,python,numpy,signal-processing,fft,frequency-analysis,Python,Numpy,Signal Processing,Fft,Frequency Analysis,我试图确定信号的最主要频率。然而,当人工创建一个50赫兹的信号并应用足够的零填充来提高fft分辨率时,我得到的最高频率是49997赫兹。对于我的应用程序来说,这是一个显著的区别。我做错什么了吗 import numpy as np import matplotlib.pyplot as plt fs = 2**12 x = np.linspace(0,1,fs+1) signal = np.sin(50*2*np.pi*x) spect = abs(np.fft.fft(np.append

我试图确定信号的最主要频率。然而,当人工创建一个50赫兹的信号并应用足够的零填充来提高fft分辨率时,我得到的最高频率是49997赫兹。对于我的应用程序来说,这是一个显著的区别。我做错什么了吗

import numpy as np
import matplotlib.pyplot as plt

fs = 2**12

x = np.linspace(0,1,fs+1)

signal = np.sin(50*2*np.pi*x)
spect = abs(np.fft.fft(np.append(signal,np.zeros(999*fs))))

plt.figure('Four Coef')
plt.plot(spect)
plt.axis([49995,49999,2048.01,2048.05])

plt.show()
请注意,由于零填充,系数49997对应于49997 Hz的频率

编辑:数组正好表示1秒的50 Hz信号。最后999秒为零,以便将fft“分辨率”增加到1 mHz。我只有1秒的信号可用,从中我需要最高频率,精确到兆赫


更改采样率
fs=2**8
的最大值为49.999,因此我认为采样方式在这里很关键…

您没有对50Hz波进行1000秒的FFT:您传递到
np.FFT.FFT
的阵列是信号的1秒,然后是999秒的静默零)。因此,你的信号剪辑FFT到一个时髦的,多峰的东西

当我使用连续信号执行以下操作时,我看到指数50000处的峰值与预期一致:

import numpy as np
import matplotlib.pyplot as plt

fs = 2**12

x = np.linspace(0,1000,fs*1000)

signal = np.sin(50*2*np.pi*x)
spect = abs(np.fft.fft(signal))

plt.figure('Four Coef')
plt.plot(spect)
print np.argmax(spect), np.max(spect)

plt.show()
输出:

50000 2047497.79244
NB1/仅仅重复你的数组也不会正常工作,因为末端不会“匹配”(信号将从一个1s数组的末尾跳到下一个1s数组的开头)


NB2//您可以考虑使用和获得频率。

< P>如果FFT的长度是该信号的频率周期的精确整数倍,峰值幅度FFT结果bin的频率将指示信号<强> >仅< /强>的频率。对于任何其他频率,请尝试使用频率估计算法(如FFT结果的抛物线或Sinc插值,但还有许多其他估计方法),而不仅仅是原始单峰幅度bin频率。

999秒的静默时间对于在mHz分辨率下进行调查至关重要。不幸的是,我只能处理1秒的信号,而不是1000秒的信号。这些奇怪的峰值被称为光谱泄漏。啊,我误解了你在做什么。你可以转而寻找另一个答案。顺便说一下,
linspace(0,1,fs+1)
将返回一个
fs+1
点数组,这可能(也可能不是)您在这里想要的。@xnx对于
fs
的采样率,
linspace(0,1,fs+1)
是正确的。或者,可以使用
linspace(0,1,fs,endpoint=False)
。我注意到我应该解释得更好,谢谢!实际上,我想要fs+1,因为端点也包括在内。使用二次插值技术,我得到了相同的结果。为了简单起见,我特意省略了它。将fft的长度打印为一个数字。spect的长度是2048001。指数0表示0 Hz,指数2048000表示2048 Hz,这正好是fs/2。矩阵向量乘法的更简单DFT实现产生相同的结果,无论有无二次插值。尝试N=2048000的FFT长度,其中指数N/2表示fs/2,指数0表示fs(和DC)。该长度将是50 Hz周期的整数倍。无差异。此外,当使用1Hz信号代替50时,估计误差约为50倍。也许这些信息有帮助?使用
signal=np.sin(50*2*np.pi*x)
估计值实际上返回0.837Hz而不是1Hz