傅里叶变换并把结果保存在excel文件中

import os
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import xlwt

def fft0_7(x,y):#傅里叶变换
    #采样点选择1400个,因为设置的信号频率分量最高为600Hz,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400Hz(即一秒内有1400个采样点)
    # x=np.linspace(0,1,401)
    #
    # #设置需要采样的信号,频率分量有180,390和600
    # y=7*np.sin(2*np.pi*50*x) + 1.5*np.sin(2*np.pi*100*x)+5.1*np.sin(2*np.pi*150*x)+1
    #
    yy=fft(y)                     #快速傅里叶变换
    # yreal = yy.real               # 获取实数部分
    # yimag = yy.imag               # 获取虚数部分

    yf=abs(yy)                # 取模
    yf1=yf/((len(x)/2))           #归一化处理
    yf1[0]=yf1[0]/2
    yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间

    xf = np.arange(len(y))        # 频率
    xf1 = xf
    xf2 = xf[range(int(len(x)/2))]  #取一半区间
    # yf2=list(yf2)
    # yf2.sort(reverse=True)
    # print(yf2[:6])
    # print(yf2.index(max(yf2)))

    # yf2 = list(yf2)
    # yf3 = sorted(yf2, reverse=True)
    # print(yf2.index(yf3[0]))
    # print(yf2.index(yf3[1]))
    # print(yf2.index(yf3[2]))
    # print(yf2.index(yf3[3]))
    # print('*******************')
    # print(yf2[:55])
    return [yf2[0],yf2[5],yf2[10],yf2[15],yf2[20],yf2[25],yf2[30],yf2[35]]

    # #原始波形
    # plt.subplot(221)
    # # plt.plot(x[0:50],y[0:50])
    # plt.plot(x, y)
    # plt.title('Original wave')
    # #混合波的FFT(双边频率范围)
    # plt.subplot(222)
    # plt.plot(xf,yf,'r') #显示原始信号的FFT模值
    # plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表
    # #混合波的FFT(归一化)
    # plt.subplot(223)
    # plt.plot(xf1,yf1,'g')
    # plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')
    #
    # plt.subplot(224)
    # plt.plot(xf2[:55],yf2[:55],'b')
    # plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')
    #
    # plt.show()

def getRes(filepath):
    dirs = os.listdir(filepath)
    worbook = xlwt.Workbook()
    sheet = worbook.add_sheet('傅里叶变换结果', cell_overwrite_ok=True)
    i=0
    sheet.write(i, 0, '对应文件')
    for j in range(7):
        for k in range(8):
            tmpj=str(j+1)
            tmpk=str(k)
            sheet.write(i,j*8+k+1,'第'+tmpj+'列数据对应的频域值:'+'50*'+tmpk+'Hz')
    # i=1
    for file in dirs:
        i += 1
        f = open(filepath + '\\' + file)
        sheet.write(i, 0, file)
        t=[]
        vi=[]
        for line in f.readlines():
            line=[float(i) for i in line.strip().split()]
            t.append(line[0])
            viTmp=line[1:]
            viTmp[-1]=viTmp[-1]/3 #零序分量除以3
            vi.append(viTmp)
        f.close()
        t=np.array(t)
        vi=[[row[i] for row in vi] for i in range(7)] #vi有7列
        vi=np.array(vi)
        # print(t)
        # print(vi.shape)
        #计算出傅里叶变换的值,存进excel文件中
        for m in range(7):
            # t=np.linspace(0,0.01,5001)
            fftres=fft0_7(t,vi[m]) #8个值
            for j in range(8):
                sheet.write(i, m*8+j+1,fftres[j])

    worbook.save('傅里叶变换结果' + '.xls')
if __name__ == '__main__':
    getRes("C:\\Users\张海洋\\Desktop\本科毕设\测试文件")

你可能感兴趣的:(机器学习常用函数)