2011-07-18 66 views
64

Tôi cần một số trợ giúp để hiểu đầu ra của tính toán DFT/FFT.Hiểu đầu ra FFT

Tôi là kỹ sư phần mềm có kinh nghiệm và cần giải thích một số chỉ số gia tốc trên điện thoại thông minh, chẳng hạn như tìm tần số chính. Thật không may, tôi đã ngủ qua hầu hết các lớp học đại học EE của tôi mười lăm năm trước, nhưng tôi đã đọc lên trên DFT và FFT trong vài ngày qua (ít có ích).

Vui lòng không trả lời "đi tham gia lớp học EE". Tôi đang thực sự lên kế hoạch để làm điều đó nếu chủ nhân của tôi sẽ trả tiền cho tôi. :)

Vì vậy, đây là vấn đề của tôi:

Tôi đã ghi lại tín hiệu ở 32 Hz. Đây là một mẫu thứ hai của 32 điểm, mà tôi đã xếp hạng trong Excel.

enter image description here

sau đó tôi có một số FFT code viết bằng Java từ Đại học Columbia (sau khi làm theo những gợi ý trong một bài đăng trên "Reliable and fast FFT in Java").

Kết quả của chương trình này như sau. Tôi tin rằng nó đang chạy một FFT tại chỗ, vì vậy nó tái sử dụng cùng một bộ đệm cho cả đầu vào và đầu ra.

Before: 

Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ] 

Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] 

After: 

Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ] 

Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ] 

Vì vậy, tại thời điểm này, tôi không thể tạo đầu hoặc đuôi của đầu ra. Tôi hiểu các khái niệm DFT, chẳng hạn như phần thực là biên độ của sóng cosin thành phần và phần ảo là biên độ của sóng sin thành phần. Tôi cũng có thể làm theo sơ đồ này từ cuốn sách tuyệt vời "The Scientist and Engineer's Guide to Digital Signal Processing": enter image description here

Vì vậy, câu hỏi cụ thể của tôi là:

  1. Từ đầu ra của FFT, làm thế nào để tìm ra 'hầu hết các tần số xảy ra' ? Đây là một phần trong phân tích dữ liệu gia tốc kế của tôi. Tôi có nên đọc các mảng thực (cosin) hoặc ảo (sin) không?

  2. Tôi có đầu vào 32 điểm trong miền thời gian. Không nên đầu ra của FFT là một mảng 16 phần tử cho thực và một mảng 16 phần tử cho tưởng tượng? Tại sao chương trình cho tôi kết quả đầu ra mảng thực và tưởng tượng cả hai kích thước 32?

  3. Liên quan đến câu hỏi trước, làm cách nào để phân tích cú pháp các chỉ mục trong mảng đầu ra? Với đầu vào của tôi 32 mẫu được lấy mẫu ở 32 Hz, sự hiểu biết của tôi là đầu ra mảng 16 phần tử nên có chỉ số của nó thống nhất lên tới 1/2 tốc độ lấy mẫu (32 Hz), vì vậy tôi hiểu chính xác từng phần tử của mảng đại diện (32 Hz * 1/2)/16 = 1 Hz?

  4. Tại sao đầu ra FFT có giá trị âm? Tôi nghĩ rằng các giá trị đại diện cho biên độ của một xoang. Ví dụ, đầu ra của Real [3] = -1.075 nên có nghĩa là biên độ -1.075 cho một làn sóng cosin của tần số 3. Có đúng không? Biên độ có thể âm tính như thế nào?

+0

Bạn muốn tính toán gì từ các chỉ số gia tốc: vận tốc, khoảng cách? Tiếng ồn của các bài đọc gia tốc theo sau sự phân bố Gaussian và tôi không thể thấy sự phù hợp của sóng sin sẽ khắc phục điều đó như thế nào. – Ali

+0

Thẻ java nên được loại bỏ vì nó chung chung hơn một ngôn ngữ cụ thể – user3791372

Trả lời

65
  1. Bạn không nên tìm phần thực hoặc trí tưởng tượng của một số phức (đó là mảng thực và tưởng tượng của bạn). Thay vào đó bạn muốn tìm độ lớn của tần số được định nghĩa là sqrt (real * real + imag * imag). Con số này sẽ luôn dương. Bây giờ tất cả các bạn phải tìm kiếm là cho giá trị tối đa (bỏ qua các mục đầu tiên trong mảng của bạn. Đó là DC của bạn bù đắp và mang không có thông tin phụ thuộc vào tần số).

  2. Bạn nhận được 32 kết quả đầu ra thực và 32 hình ảnh tưởng tượng vì bạn đang sử dụng FFT phức tạp đến phức tạp. Hãy nhớ rằng bạn đã chuyển đổi 32 mẫu của bạn thành 64 giá trị (hoặc 32 giá trị phức tạp) bằng cách mở rộng nó bằng các phần không tưởng tượng. Điều này dẫn đến kết quả đầu ra FFT đối xứng trong đó kết quả tần số xảy ra hai lần. Khi đã sẵn sàng để sử dụng trong các đầu ra 0 đến N/2, và một khi được nhân đôi trong các đầu ra N/2 đến N. Trong trường hợp của bạn, đơn giản nhất là bỏ qua đầu ra N/2 đến N. Bạn không cần chúng, chúng chỉ là một tạo phẩm về cách bạn tính toán FFT của bạn.

  3. Phương trình tần số để fft-bin là (bin_id * freq/2)/(N/2) trong đó freq là tần số mẫu của bạn (còn gọi là 32 Hz và N là kích thước của FFT). Trong trường hợp của bạn, nó đơn giản hóa thành 1 Hz mỗi thùng. Các thùng N/2 đến N đại diện cho các tần số âm (khái niệm lạ, tôi biết). Đối với trường hợp của bạn, chúng không chứa bất kỳ thông tin quan trọng nào vì chúng chỉ là một tấm gương của các tần số N/2 đầu tiên.

  4. Các bộ phận thực và tưởng tượng của mỗi thùng tạo thành một số phức. Sẽ không sao nếu các phần thực và tưởng tượng là âm trong khi độ lớn của tần số chính nó là dương (xem câu trả lời của tôi cho câu hỏi 1). Tôi đề nghị bạn đọc lên những con số phức tạp. Giải thích cách chúng hoạt động (và tại sao chúng hữu ích) vượt quá những gì có thể giải thích trong một câu hỏi stackoverflow duy nhất.

Lưu ý: Bạn cũng có thể muốn đọc tự động tương quan là gì và cách nó được sử dụng để tìm tần số cơ bản của tín hiệu. Tôi có cảm giác rằng đây là những gì bạn thực sự muốn.

+0

Cảm ơn. Về 1: Tôi đã thấy trang Matlab này hiển thị phổ tần số (http://www.mathworks.com/help/techdoc/ref/fft.html). Trên trang đó là một cốt truyện với tiêu đề "Phổ biên độ một mặt của y (t)". Là âm mưu của cường độ của tần số như bạn đề nghị, sqrt (thực^2 + img^2)? Về 3: Tôi vẫn không nhận được kết quả 2Hz mỗi thùng. Trong trường hợp của tôi, N = 32 và freq = 32, phải không? Vì vậy, có N/2 = 32/2 = 16 thùng, và tần số cao nhất (Nyquist) là freq/2 = 32/2 = 16 Hz, kết quả là 16 Hz mỗi 16 thùng, cho 1 Hz mỗi thùng? – stackoverflowuser2010

+0

Có, cốt truyện cho thấy độ lớn của phổ - | Y (f) |. Các thanh giá trị tuyệt đối có nghĩa là độ lớn. Bin width = tỷ lệ mẫu/kích thước FFT. Tỷ lệ mẫu của bạn là 32 hz, kích thước FFT của bạn là 32. Có, bạn đúng về độ rộng của thùng! –

+0

Cố định tần số bin. –

4

1) Tìm chỉ số trong mảng thực có giá trị cao nhất, bên cạnh giá trị đầu tiên (đó là thành phần DC). Có thể bạn sẽ cần tốc độ mẫu cao hơn đáng kể so với 32 Hz và kích thước cửa sổ lớn hơn để thu được nhiều kết quả có ý nghĩa.

2) Phần thứ hai của cả hai mảng là gương của nửa đầu.Ví dụ, lưu ý rằng phần tử cuối cùng của mảng thực (1.774) giống với phần tử thứ hai (1.774) và phần tử cuối cùng của mảng tưởng tượng (1.474) là tiêu cực của phần tử thứ hai.

3) Tần suất tối đa bạn có thể nhận ở tốc độ mẫu 32 Hz là 16 Hz (Nyquist limit), do đó, mỗi bước là 2 Hz. Như đã nói ở trên, hãy nhớ rằng phần tử đầu tiên là 0 Hz (nghĩa là độ lệch DC).

4) Chắc chắn, một biên độ âm có ý nghĩa hoàn hảo. Nó chỉ có nghĩa là tín hiệu được "lật" - một FFT chuẩn dựa trên cosin, thường có giá trị = 1 tại t = 0, do đó tín hiệu có giá trị = -1 tại thời gian = 0 sẽ có biên độ âm .

+0

Cảm ơn bạn đã trả lời. (1) Bạn có nghĩa là tôi có thể bỏ qua mảng ảo (sin), và nếu có, tại sao?Chắc chắn thành phần sin phải quan trọng? (2) Tại sao việc phản chiếu này xảy ra? Nó chỉ là kết quả của thuật toán FFT? Hầu hết mọi người bỏ qua một nửa được nhân đôi? (3) Làm thế nào bạn tính toán các bước của 2Hz? Tôi hiểu giới hạn Nyquist là 16Hz, vì vậy nếu có 16 phần tử mảng (không được nhân đôi), mỗi phần tử phải là 16 Hz/16 = 1 Hz mỗi phần tử? (4) Để tìm tần số chính, tôi chỉ cần lấy giá trị tuyệt đối của các giá trị biên độ trong các mảng đầu ra? – stackoverflowuser2010

+0

Bạn không nên tìm trong mảng thực cho giá trị cao nhất, và bạn không thể bỏ qua mảng sine/I. Thay vào đó bạn muốn độ lớn của vector phức hợp phức hợp. Phản chiếu xảy ra bởi vì một nửa đầu vào (mảng I) là tất cả các số không, do đó kết quả có một nửa mức độ tự do. Bạn có thể bỏ qua nó nếu dữ liệu của bạn là đúng. – hotpaw2

+0

Có, chiều rộng thùng là 1 hz. –

7

Bạn đã có một số câu trả lời hay, nhưng tôi sẽ chỉ thêm rằng bạn thực sự cần áp dụng window function cho dữ liệu miền thời gian của mình trước FFT, nếu không bạn sẽ nhận được đồ tạo tác khó chịu trong quang phổ của mình.

3

Lưu ý rằng "tần số xuất hiện nhiều nhất" có thể bị văng vào nhiều thùng FFT, ngay cả với chức năng cửa sổ. Vì vậy, bạn có thể phải sử dụng một cửa sổ dài hơn, nhiều cửa sổ hoặc nội suy để ước tính tốt hơn tần số của bất kỳ đỉnh phổ nào.

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