2011-11-29 203 views
1

基本上我有一個excel文件,第一列有電壓,第二列有時間。我想找到電壓的週期,因爲它返回一個y軸電壓和x軸時間週期的圖形,看起來類似於一個正弦函數。將excel文件轉換爲python頻率

要找到我已經上傳我的excel文件到python的頻率,因爲我認爲這會使它更容易 - 可能有一些我錯過了,這將簡化這一點。

所以在python到目前爲止,我有:

import xlrd 
import numpy as N 
import numpy.fft as F 
import matplotlib.pyplot as P 

wb = xlrd.open_workbook('temp7.xls') #LOADING EXCEL FILE 
wb.sheet_names() 
sh = wb.sheet_by_index(0) 

first_column = sh.col_values(1) #VALUES FROM EXCEL 
second_column = sh.col_values(2) #VALUES FROM EXCEL 

現在我該怎樣找到這樣的頻率是多少?

回答

1

我不確定你對傅里葉變換知道多少,所以請原諒我,如果這是背景太多。
你的信號沒有「頻率」,但它可以被認爲是許多頻率的總和。傅立葉變換將告訴你構成信號的所有頻率的權重。不幸的是,當從模擬(連續時間)採樣到數字(離散時間)域時,信息可能會丟失。這使得制約上,我們可以得到關於頻率的信息 - 即我們能夠確定的最高頻率分量與數字採樣率(Nyquist-Shannon criterion):

fs > 2B 

哪裏fs是你的採樣率(採樣/單位時間,通常以Hz或類似的方式),而B是信號的最大頻率。如果您的信號實際上的頻率高於B,則它們將被「別名」爲低於B的某個值。

對於你的問題,你需要做的是這樣的:

x = N.array(first_column) 
X = F.fft(x) 

現在X是你的電壓信號的頻域代表。基於採樣定理,相應的頻率軸涵蓋[0, fs)。那麼,什麼是fs?你需要通過看你有你的採樣信號的總時間除以樣本的數量來計算(注意你的單位在這裏):

fs = len(second_column)/second_column[-1] 

注意,你的信號的這種表示也將(可能)是複雜的,即每個頻率將具有相關的幅度和相位。

希望這有助於,並希望我沒有涵蓋一堆你已經知道的東西。

+3

OP有兩列,時間和電壓。你不能假設所有的時間步驟都是相同的,所以你首先必須將信號插入一個統一的採樣信號(使用'numpy.interp1d()'或類似的)來執行有意義的FFT。 –

+0

夠公平的。可以說,如果您處理的是非均勻採樣信號,則會增加複雜性。 – aganders3

+0

我的代碼現在返回一個採樣率fs(記錄率),並且X給出一個複數,我需要絕對的這個值嗎? – Jacob