2013-03-07 14 views
13

Tôi có dữ liệu từ một cảm biến và tôi cần phải tìm tần số của nó. Có vẻ như fft() dường như là con đường để đi, nhưng các tài liệu MATLAB chỉ cho thấy làm thế nào để có được một đồ thị của các tần số, tôi không biết phải làm gì từ đó.Xác định tần số từ dữ liệu tín hiệu trong MATLAB

Đây là những gì dữ liệu của tôi trông giống như:

enter image description here

Trả lời

18

Một cách để đi thực sự là sử dụng một FFT. Vì fft cho bạn biểu diễn tần số của tín hiệu, bạn muốn tìm mức tối đa, và vì fft là tín hiệu phức tạp, bạn sẽ muốn lấy giá trị tuyệt đối trước tiên. Chỉ số sẽ tương ứng với tần số chuẩn hóa với năng lượng tối đa. Cuối cùng, nếu tín hiệu của bạn có độ lệch, như trường hợp với tín hiệu bạn hiển thị, bạn muốn loại bỏ khoảng trống đó trước khi lấy fft sao cho bạn không nhận được giá trị cực đại tại gốc đại diện cho thành phần DC.

Tất cả những gì tôi mô tả đặt trong một dòng sẽ là:

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

nơi indexMax là chỉ số trong đó giá trị FFT tối đa có thể được tìm thấy.

Lưu ý: để lấy từ indexMax đến tần suất quan tâm thực tế, bạn sẽ cần biết chiều dài L của fft (giống như độ dài tín hiệu của bạn) và tần số lấy mẫu Fs. Tần số tín hiệu sau đó sẽ là:

frequency = indexMax * Fs/L; 

Ngoài ra, nhanh hơn và làm việc khá tốt quá phụ thuộc vào tín hiệu mà bạn có, lấy tự tương quan của tín hiệu của bạn:

autocorrelation = xcorr(signal); 

và tìm tối đa đầu tiên xảy ra sau điểm trung tâm của sự tự tương quan. (Tự tương quan sẽ đối xứng với mức tối đa của nó ở giữa.) Bằng cách tìm ra mức tối đa đó, bạn sẽ tìm thấy vị trí đầu tiên mà tín hiệu chuyển dịch trông ít nhiều giống như chính nó. I E. bạn tìm thấy khoảng thời gian tín hiệu của bạn. Vì tín hiệu được dịch chuyển bởi một bội số của khoảng thời gian của nó sẽ luôn luôn trông giống như chính nó, bạn cần phải chắc chắn rằng mức tối đa bạn tìm thấy thực sự tương ứng với khoảng thời gian của tín hiệu và không phải là một bội số của nó.

Do tiếng ồn trong tín hiệu của bạn, mức tối đa tuyệt đối có thể xảy ra rất tốt tại nhiều thời kỳ của bạn thay vì chính chu kỳ. Vì vậy, để giải thích cho tiếng ồn đó, bạn sẽ mất tối đa tuyệt đối của tự tương quan (autocorrelation (length (autocorrelation)/2 + 1), và sau đó tìm nơi tự tương quan lớn hơn, nói, 95% giá trị lớn nhất cho lần đầu tiên thời gian trong nửa sau của tín hiệu 95%, 99% hoặc một số số khác sẽ tùy thuộc vào mức độ nhiễu của tín hiệu của bạn. Nếu tần số bạn có nghĩa là đại diện tần số của tín hiệu của bạn, sau đó đến một xấp xỉ đầu tiên, bạn chỉ muốn âm mưu abs của FFT để có được một ý tưởng về nơi năng lượng là:

plot(abs(fft)); 

Nếu bạn muốn hiểu lý do tại sao có một abs, hoặc những thông tin liên quan bạn đang mất bằng cách không đại diện cho giai đoạn của fft, bạn có thể muốn đọc thêm một chút về biến đổi DFT để hiểu chính xác những gì bạn nhận được.

+0

Tín hiệu mà tôi có được từ một số dao động được đo bằng máy đo biến dạng. Tôi muốn tìm tần số của những dao động đó. Sử dụng phương pháp 'fft' bạn đã đăng, tôi nhận được 0,0357 cho tần suất, nhưng bằng cách nhìn vào cốt truyện, có khoảng 10 chu kỳ mỗi giây, vì vậy tôi không nên nhận được khoảng 10 cho tần số? – edc1591

+0

Nếu bạn có 10 dao động mỗi giây, đó là khoảng thời gian là 0,1 giây hoặc tần số là 10 Hz. Các giá trị cho indexMax, L và Fs là gì? Cũng chạy cốt truyện (abs (fft)) để xác nhận rằng bạn có tăng đột biến lớn và indexMax là chỉ mục chính xác cho vị trí tăng đột biến đó. Tôi nhận thấy trong đồ thị bạn chỉ ra rằng có một chênh lệch âm trong tín hiệu của bạn, có nghĩa là cũng sẽ có một cành gần bằng không cho fft của bạn đại diện cho thành phần DC. Nó có thể là những gì bạn đang đo. Nếu đúng như vậy, hãy lấy fft (thay vì tín hiệu (tín hiệu)) để loại bỏ thành phần DC đó. – Lolo

+0

Mức tăng đột biến mà tôi nhận được ở mức 0 (indexMax = 1). Tôi đã làm những gì bạn nói bằng cách trừ trung bình (tín hiệu) và bây giờ tôi nhận được khoảng 9,8 Hz cho tần số, có vẻ như đúng! Cảm ơn rất nhiều vì sự giúp đỡ!! – edc1591

0

Tôi nghĩ rằng nó phải được

(indexMax-1) * Fs/L 

Yếu tố đầu tiên của abs (FFT (x)) là dòng điện một chiều (DC), hoặc thiên vị, hoặc hình thức tín hiệu, hoặc X0. Chúng tôi tính từ yếu tố thứ hai (X1). Vui lòng cho tôi biết nếu tôi sai. Cảm ơn. enter image description here

clear all 
clc 
close all 
Fs = 1; 
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal 
t = 0:Fs:T; % T seconds 
L = length(t); % L is the length of sample sequence 
bias = 4 
signal = sin(t) + bias; 

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

frequency_method1 = (indexMax-1) * Fs/(L-1); 
frequency_method2 = (indexMax-1) * Fs/L; 


number_of_cycles_method1 = frequency_method1*T 

number_of_cycles_method2 = frequency_method2*T 


subplot(2,1,1) 
plot(t,signal,'-or') ; grid on; 
legend('about 1.7 cycles of cosine signal') 
subplot(2,1,2) 
plot(abs(fft(signal-mean(signal))),'-xb'); grid on 
legend('abs of fft') 

number_of_cycles_method1 = 

    2 


number_of_cycles_method2 = 

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