2011-12-20 33 views
7

Tôi có một tập tin mẫu điền với số dấu chấm động như sau:Xác định tần số của một mảng bằng Python

-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 

Những con số này được đặt trong một tập tin văn bản. Tôi đang cố gắng đọc các tập tin văn bản và xác định tần số của tín hiệu này. Dữ liệu này được chụp từ một dao động số. Tôi có thể thấy tần số trong hiển thị phạm vi nhưng tôi cũng muốn xác thực nó bằng cách xử lý nó bằng Python. Tôi chụp dữ liệu từ thiết bị với Python ở phía PC.

Mặc dù tôi có thể thực hiện một số nội dung cấp thấp bằng Python, tôi là tổng số người mới tham gia xử lý văn bản. Tôi cho rằng trước tiên tôi cần tải dữ liệu trong tệp vào một mảng và sau đó thực hiện một FFT hoặc một thuật toán đơn giản hơn sẽ mang lại một số nguyên bằng Hz.

Về lý thuyết tôi biết cách thực hiện phân tích Fourier và tôi có thể thực hiện nó trên giấy cho bất kỳ tín hiệu nào. Tôi không biết bắt đầu từ đâu trong Python cho một tập dữ liệu nhất định. Tôi đã cố gắng tài liệu của scipy-numpy nhưng không làm việc tốt cho tôi.

Tôi sẽ đánh giá cao hướng dẫn của người dùng có kinh nghiệm.

+0

Bạn có thể tìm thấy [câu hỏi liên quan] này (http://stackoverflow.com/q/1303307/183066) hữu ích. – jcollado

Trả lời

11

Nó không rõ ràng từ câu hỏi của bạn chính xác những gì các giá trị trong tập tin đại diện. Nhưng giả định rằng họ chỉ ra mẫu điện áp liên tục, bạn có thể tải các tập tin vào một mảng NumPy sử dụng

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

và sau đó tính toán biến đổi Fourier như

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

Sau đó, bạn có thể vẽ đồ thị độ lớn của FFT như

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

và những gì bạn thấy phải khớp với nội dung hiển thị trên dao động.

Nếu bạn muốn xác định tần số chi phối trong quang phổ, bạn sẽ phải cắt mảng tại một số ngưỡng, ví dụ: một cái gì đó như thế này:

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

Nội dung freq (và do đó cũng peaks) là tần số theo đơn vị tỷ lệ lấy mẫu. Ví dụ, nếu dao động của bạn lấy mẫu dạng sóng mỗi micro giây, các giá trị trong freq là megahertz. Vì vậy, nếu bạn cho nguồn tín hiệu 1 kHz lý tưởng, bạn có thể thực hiện với ví dụ:

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

bạn sẽ đạt đỉnh ở 0,001 MHz và theo đó bạn sẽ thấy rằng peaks = array([-0.001, 0.001]).

+0

Có chính xác, các giá trị được lưu trong tệp là điện áp. Khi tôi đã làm những gì bạn đề nghị tôi nhận được một lỗi sau đây: ValueError: thiết lập một phần tử mảng với một chuỗi. – y33t

+0

Đó là những gì xảy ra khi không phải tất cả các dòng trong tệp đều có cùng số cột. Hãy thử phiên bản đã chỉnh sửa. –

+0

Với các sửa đổi sau; freq = np.fft.fftfreq (len (quang phổ)) Tôi đã cung cấp tín hiệu 1Khz để xác thực hoạt động và kết quả là; 0.00000000e + 00 2.45098039e-05 4.90196078e-05 ..., 7.35294118e-05 -4.90196078e-05 -2.45098039e-05 Tôi đang thiếu gì? – y33t

Các vấn đề liên quan