2012-01-13 35 views
12

Tôi đã xem aurioTouch 2 từ mã mẫu của Apple (found here). Vào cuối ngày, tôi muốn tự phân tích tần số. Bây giờ tôi đang cố gắng để hiểu một số những gì đang xảy ra ở đây. Lời xin lỗi của tôi nếu điều này là tầm thường, chỉ cần cố gắng để hiểu một số số ma thuật chưa được giải quyết trôi nổi xung quanh trong một số nguồn. Điểm chính của tôi về sự nhầm lẫn ngay bây giờ là:Hiểu FFT ở aurioTouch2

  1. Tại sao chúng không có giá trị nyquist trong FFTBufferManager :: ComputeFFT? Liệu giá trị này có thực sự bị vứt bỏ không? (~ dòng 112 của FFTBufferManager.cpp).
  2. Chúng chia tỷ lệ mọi thứ xuống -128db, vì vậy tôi giả sử rằng kết quả là như vậy trong phạm vi (-128, 0). Tuy nhiên, sau đó trong aurioTouchAppDelegate.mm (~ dòng 807), chúng chuyển đổi giá trị này thành giá trị từ 0 đến 1 bằng cách thêm 80 và chia cho 64, sau đó kẹp thành 0 và 1. Tại sao độ mờ? Ngoài ra, tôi phải trong giả định giá trị sẽ được trong vùng lân cận của (-128, 0)?

Trả lời

13

Vâng, nó không tầm thường đối với tôi, nhưng đây là cách tôi hiểu nó. Nếu tôi đã đơn giản hóa nó hoàn toàn là vì lợi ích của tôi, tôi không có nghĩa là để được bảo trợ.

Zeroing kết quả tương ứng với tần số Nyquist:

Tôi sẽ giả sử chúng ta đang tính toán FFT phía trước 1024 mẫu đầu vào. Tại 44100hz đầu vào này thường là đúng trong trường hợp của tôi (nhưng không phải là những gì AurioTouch đang làm, mà tôi tìm thấy một chút lạ, nhưng tôi không có chuyên gia). Tôi dễ hiểu hơn với các giá trị cụ thể.

Cho 1024 (n) mẫu đầu vào, được sắp xếp khi cần (ngay cả chỉ mục 'đầu tiên sau đó chỉ mục lẻ' {in [0], in [2], in [4],…, in 1, in [3], trong [5], ...}) (sử dụng vDSP_ctoz() để đặt hàng đầu vào của bạn)

Kết quả của FFT 1024 mẫu (n) đầu vào là ((n/2) +1) giá trị phức tạp. tức là 513 thực thành phần và 513 tưởng tượng thành phần, tổng số giá trị.

Tuy nhiên, tưởng tượng [0]tưởng tượng [512] (n/2) luôn, nhất thiết, zero. Vì vậy, bằng cách đặt thực [512] (thành phần thực của thùng tần số Nyquist) tại tưởng tượng [0] và quên tưởng tượng [512] - luôn luôn bằng không và có thể suy ra, kết quả được đóng gói vào (n) bộ đệm độ dài.

Vì vậy, đối với kết quả trả về hợp lệ, bạn phải đặt ít nhất tưởng tượng [0] về 0. Nếu bạn yêu cầu tất cả ((n/2) +1) thùng tần số bạn cần phải thêm một giá trị phức tạp để kết quả và thiết lập nó như vậy ..

unpackedVal = imaginary[0] 
real[512]=unpackedVal, imaginary[512]=0 
imaginary[0] = 0 

Trong AurioTouch tôi luôn coi họ chỉ don' t bận tâm.n/2 kết quả rõ ràng là thuận tiện hơn để làm việc với và bạn khó có thể nói từ visualizer: - "Oh nhìn, nó còn thiếu một tầm quan trọng ở tần số Nyquist"

The UsingFourierTransforms docs explain the packing

NB các giá trị cụ thể 1024, 513, 512, v.v. là các ví dụ không phải là giá trị thực của n, (n/2) +1, n/2 từ AurioTouch.

Họ mở rộng tất cả mọi thứ xuống bởi -128db

Không hẳn, phạm vi của các giá trị đầu ra là so với số lượng mẫu đầu vào vì vậy nó phải được chuẩn hóa. Tỷ lệ là 1.0/(2 * inNumberFrames).

Sau khi mở rộng phạm vi là -1.0 -> +1.0. Độ lớn của vector phức tạp sau đó được thực hiện (giai đoạn bị bỏ qua) đưa ra một giá trị vô hướng cho mỗi bin tần số giữa 0 và 1,0

Giá trị này sau đó được giải thích như là một giá trị decibel giữa -128 và 0

Công cụ vẽ… +80/64.… * 120…… tôi không chắc chắn. Tôi có thể hoàn toàn sai hoặc có thể là… giấy phép nghệ thuật?

+0

Cảm ơn bạn đã dành thời gian giải thích điều này cho tôi. –

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