Python2.7中合并两个代码的FFT

Python2.7中合并两个代码的FFT,python,python-2.7,numpy,fft,merging-data,Python,Python 2.7,Numpy,Fft,Merging Data,我有两个FFT代码,但我需要合并它们,因为它们在某些部分似乎工作得很好。让我解释一下。 第一个代码: fft1 = (Bx[51:-14]) fft2 = (By[1:-14]) # NS antena FFT - red FFTdata = np.sqrt(fft1*fft1)**1 samples = FFTdata.size # WE antena FFT - blue FFTdata2 = np.sqrt(fft2*fft2)**1 samples2 = FFTdata2.size

我有两个FFT代码,但我需要合并它们,因为它们在某些部分似乎工作得很好。让我解释一下。 第一个代码:

fft1 = (Bx[51:-14])
fft2 = (By[1:-14])

# NS antena FFT - red
FFTdata = np.sqrt(fft1*fft1)**1
samples = FFTdata.size

# WE antena FFT - blue
FFTdata2 = np.sqrt(fft2*fft2)**1
samples2 = FFTdata2.size

# Adjusting FFT variables
duration = 300 # in seconds
Fs = float(samples)/duration # sampling frequency (sample/sec)
delta_t = 1.0/Fs
t = np.arange(0, samples, 1)*delta_t
FFTdata_freq = np.abs(np.fft.rfft(FFTdata))**1
FFTdata2_freq2 = np.abs(np.fft.rfft(FFTdata2))**1
freq = np.fft.rfftfreq(samples, d=delta_t)
freq2 = np.fft.rfftfreq(samples2, d=delta_t)

# Printing data
plt.semilogy(freq, FFTdata_freq, color='r')
plt.semilogy(freq2, FFTdata2_freq2, color='b')
plt.xticks([0,20,40,60,80,100,120,140,160,180,200,220,240,260,280,300, 
320,340,360,380,400,420,440])
第二个代码:

# Number of samplepoints
N = 600
# sample spacing
T = 300.0 / 266336.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
现在问题来了。我有两个用于FFT的代码,但我不知道如何使它们工作。第一个代码正确地显示了我的数据,在图表上有上图,但是比例是错误的,我需要上图位于下图的位置。我不知道怎么做。有什么想法吗? fft1和fft2是数据数组。每件事都发生在300秒=30万毫秒

在使用@zck更改代码后,看起来是这样的 从scipy.signal导入welch

plt.subplot(212)
plt.title('Fast Fourier Transform')
plt.ylabel('Power [a.u.]')
plt.xlabel('Frequency Hz')
fft1 = (Bx[51:-14])
fft2 = (By[1:-14])

for dataset in [fft1]:
    dataset = np.asarray(dataset)
    psd = np.abs(np.fft.fft(dataset))**2.5
    freq = np.fft.fftfreq(dataset.size, float(300)/dataset.size)
    plt.semilogy(freq[freq>0], psd[freq>0]/dataset.size**2, color='r')

for dataset2 in [fft2]:
    dataset2 = np.asarray(dataset2)
    psd2 = np.abs(np.fft.fft(dataset2))**2.5
    freq2 = np.fft.fftfreq(dataset2.size, float(300)/dataset2.size)
    plt.semilogy(freq2[freq2>0], psd2[freq2>0]/dataset2.size**2, color='b')
我做了一些修改。我只是错过了汉明窗,有谁能帮我从这张图表中得出:

那一个:

快速查看,在上面的代码片段中,您似乎忘记了除以N。这是一个数学问题,而不是代码问题

一般来说,如果您正在研究光谱/功率谱,请使用WOSA(=重叠段平均)方法,该方法应用窗口函数并在样本量允许的情况下进行平均。welch方法包含在
scipy.signals
中,您应该探索
scipy.signals
库,因为它在信号分析中非常方便

对于您的数据集,应使用以下代码:

from scipy.signal import welch

plt.figure()
for dataset in [Bx, By]:
    dataset = np.asarray(dataset)
    freq, psd = welch(dataset, fs=dataset.size/300, return_onesided=True)
    plt.semilogy(freq, psd/2)
注:如果
False
不需要除以2,则
psd
被2除为
单面返回
。希望这有助于生成好看的图形。上面绘制了功率谱密度。如果需要功率谱而不是功率谱密度,请传递参数
scaling='spectrum'

您还可以为窗口函数传递参数,默认值为
hanning
,但它包括最常见的窗口,如blackman、hamming、boxcart等


你可以在

上找到更多关于这一点的信息。我已将你的更改应用于我的问题。你可以看到它的样子。你差点帮我解决了我的问题。您的代码设置了我的图表的正确位置,但它更改了它的外观。我现在需要的是用我以前的深红色和蓝色图表替换这条浅蓝色和橙色的细线。浅蓝色和橙色的线就是蓝色和红色的线。它没有跳跃的原因是因为数据被分割成重叠的段,并从这些段计算fft。如果您希望数据以蓝色和红色线的形式非平均输出,只需将其包含在循环中:
psd2=np.abs(np.fft.fft(dataset))**2
然后
freq2=np.fft.fftfreq(dataset.size,300/dataset.size)
plt.semiology(freq2,psd2)
。我不确定您在上面的代码部分做了什么,正如我之前所说的,这是数学/傅立叶变换理解问题,而不是代码问题,因为它是零分错误,它来自
fftfreq val=1.0/(n*d)
其中
n=dataset.size
d=300/dataset.size
错误在dataset变量中。确保前面的代码片段位于我给出的for循环中,或者在执行这些行之前分别设置
Bx=dataset
。在
psd2..
freq2..
plt.semiology..
前面添加四个空格,以将它们包含在for循环中。现在他们在外面,现在只是基本的数组用法和一些数学。不要忘记除以N^2:
plt.semology(freq2[freq2>0],psd2[freq2>0]/dataset.size**2)