2011-12-20 18 views
7

mam pliku próbki wypełnione liczb zmiennoprzecinkowych w następujący sposób:Określenie częstotliwości tablicy w Pythonie

-0.02 3.04 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02 3.04 3.02 
    3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.04 3.02 3.04 3.02 
    3.06 3.02 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02 
    3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02 
    3.06 3.02 3.04 -0.02 -0.02 -0.02 -0.02 -0.02 -0.02 -0.04 -0.02 -0.04 

Liczby te są umieszczone w pliku tekstowym. Próbuję odczytać plik tekstowy i określić częstotliwość tego sygnału. Te dane są przechwytywane z oscyloskopu cyfrowego. Widzę częstotliwość na ekranie oscyloskopu, ale chcę ją również zweryfikować, przetwarzając ją w Pythonie. Przechwytywam dane z urządzenia za pomocą Pythona po stronie komputera.

Mimo że mogę robić rzeczy niskopoziomowe w Pythonie, jestem totalnym początkującym w przetwarzaniu tekstu. Przypuszczam, że najpierw trzeba załadować dane do pliku do tablicy, a następnie wykonać FFT lub prostszy algorytm, który da wynik w postaci liczby całkowitej w Hz.

Teoretycznie wiem, jak przeprowadzić analizę Fouriera i mogę to zrobić w formie papierowej dla dowolnego sygnału. Nie mam pojęcia, od czego zacząć w Pythonie dla danego zestawu danych. Próbowałem już dokumentacji scipy-numpy, ale nie działało mi dobrze.

Byłbym wdzięczny za wskazówki od doświadczonych użytkowników.

+0

Możesz znaleźć to [powiązane pytanie] (http://stackoverflow.com/q/1303307/183066) przydatne. – jcollado

Odpowiedz

11

Z twojego pytania nie wynika jednoznacznie, jakie wartości reprezentuje plik. Ale zakładając, że wskazują one próbek napięcia rzędu, można załadować plik do tablicy numpy wykorzystaniem

import numpy as np 
data = np.array([float(f) for f in file(filename).read().split()]) 

a następnie obliczenie transformaty Fouriera jako

import numpy.fft as fft 
spectrum = fft.fft(data) 

Następnie można wykreślić wartości bezwzględne FFT jak

freq = fft.fftfreq(len(spectrum)) 
plot(freq, abs(spectrum)) 

i to, co widzisz, powinno pasować do tego, co wyświetla się na oscyloskopie.

Jeśli chcesz zidentyfikować dominujące częstotliwości w widmie, musisz wyciąć tablicę z pewnym progiem, np. coś takiego:

threshold = 0.5 * max(abs(spectrum)) 
mask = abs(spectrum) > threshold 
peaks = freq[mask] 

Zawartość freq (a zatem również peaks) są częstotliwości w jednostkach próbkowania. Na przykład, jeśli twój oscyloskop będzie pobierał próbkę falową co jedną mikrosekundę, wartości w freq są w megahercach. Więc jeśli karmisz idealny sygnał 1 kHz, co możesz zrobić za pomocą np.

t = arange(4e6)/1e6 # sampling times in seconds 
data = sin(2 * pi * 1000 * t) 

co można uzyskać maksimum na 0,001 MHz, a zatem można zauważyć, że peaks = array([-0.001, 0.001]).

+0

Tak, dokładnie, wartości przechowywane w pliku są napięciami. Kiedy zrobiłem to, co sugerujesz, otrzymałem następujący błąd: ValueError: ustawienie elementu tablicy z sekwencją. – y33t

+0

To się dzieje, gdy nie wszystkie wiersze w pliku mają taką samą liczbę kolumn. Wypróbuj edytowaną wersję. –

+0

Z następującymi poprawkami; freq = np.fft.fftfreq (len (widmo)) Dostarczyłem sygnał 1Khz do zatwierdzenia operacji, a wynikiem jest; 0.00000000e + 00 2,45098039e-05 4,90196078e-05 ..., 7,35294118e-05 -4,9 99,96078e-05 -2.45098039e-05 Czego mi brakuje? – y33t

Powiązane problemy