2011-09-21 52 views
5

Tôi đã nhìn thấy các câu hỏi FFT khác nhau ở đây nhưng tôi bị nhầm lẫn về một phần của việc thực hiện. Thay vì thực hiện FFT trong thời gian thực, tôi muốn thực hiện nó ngoại tuyến. Cho phép nói rằng tôi có dữ liệu thô trong float[] audio. Tốc độ lấy mẫu là 44100 và vì vậy audio[0] to audio[44099] sẽ chứa giá trị âm thanh 1 giây. Nếu hàm FFT của tôi xử lý cửa sổ (ví dụ: Hanning), tôi có chỉ cần đặt toàn bộ bộ đệm audio vào hàm trong một lần không? Hoặc, tôi có phải cắt âm thanh thành các khối 4096 (kích thước cửa sổ của tôi) và sau đó nhập vào FFT mà sau đó sẽ thực hiện chức năng cửa sổ trên đầu trang?FFT - Khi nào cần mở cửa sổ?

+1

Chắc chắn điều này phụ thuộc vào chi tiết cụ thể của thư viện FFT mà bạn đang sử dụng. – Mankarse

+0

Câu hỏi này phù hợp hơn với dsp.stackexchange.com. Nó có nên được di chuyển không? –

+0

@Mankarse - Vâng, xin lỗi, tôi nên cụ thể hơn. Tôi đã có ba lib FFT khác nhau và không chắc chắn tôi sẽ sử dụng cái nào. Tôi đã quyết định sử dụng một trong khung công tác tăng tốc của Apple. – Skoder

Trả lời

2

Bạn có thể cần phải sao chép dữ liệu đầu vào của mình vào một bộ đệm riêng biệt và đưa nó theo đúng định dạng, ví dụ: nếu FFT của bạn là tại chỗ, hoặc nếu nó đòi hỏi dữ liệu phức tạp xen kẽ (thực/tưởng tượng). Tuy nhiên, nếu quy trình FFT của bạn có thể lấy một đầu vào hoàn toàn thực và không có tại chỗ (tức là không phá hủy) thì bạn có thể chuyển con trỏ tới dữ liệu mẫu ban đầu, cùng với tham số kích thước thích hợp.

Thường dành cho 1s âm thanh, ví dụ: lời nói hoặc âm nhạc, bạn sẽ chọn kích thước FFT tương ứng với một đoạn âm thanh hợp lý, ví dụ: 10 ms hoặc 20 ms. Vì vậy, tại 44,1 kHz kích thước FFT của bạn có thể nói 512 hoặc 1024. Sau đó bạn sẽ tạo ra quang phổ kế tiếp bằng cách tiến bộ thông qua bộ đệm của bạn và làm một FFT mới tại mỗi điểm bắt đầu. Lưu ý rằng thực tế phổ biến là chồng chéo các bộ đệm liên tiếp này, thường là 50%. Vì vậy, nếu N = 1024 FFT đầu tiên của bạn sẽ cho mẫu 0..1023, thì FFT thứ nhất của bạn sẽ là mẫu 512..1535, sau đó là 1024..2047, v.v.

+0

Cảm ơn sự giúp đỡ của Paul. Tôi sẽ sử dụng khung công tác tăng tốc của Apple, mà tôi tin rằng thực hiện một FFT tại chỗ vì vậy tôi nghĩ rằng tôi cần phải thao tác dữ liệu trong một bộ đệm riêng biệt. Vì vậy, nếu tôi có một bài hát đó là 180 giây dài, tôi chỉ đơn giản là lặp qua bộ đệm như mô tả và thực hiện FFT lên đến N = 7938000 (44100 * 180)? – Skoder

+2

Nếu tên hàm kết thúc bằng "ip" thì tên hàm sẽ được đặt tại vị trí, ví dụ: 'vDSP_fft_zrip'. Vì vậy, có, sao chép từng đoạn dữ liệu đầu vào vào bộ đệm FFT phù hợp, áp dụng chức năng cửa sổ (ví dụ: Hann), áp dụng FFT, tính phổ tần hoặc bất kỳ thứ gì bạn muốn, lưu trữ và/hoặc hiển thị phổ công suất cho đoạn này, đến đoạn tiếp theo ... –

+1

Xem thêm: http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

Kích thước chunk hoặc chiều dài cửa sổ bạn chọn kiểm soát độ phân giải tần số và độ phân giải thời gian của kết quả FFT. Bạn phải xác định điều bạn muốn hoặc những gì cần phải thực hiện.

Cửa sổ dài hơn cung cấp cho bạn độ phân giải tần số tốt hơn, nhưng độ phân giải thời gian kém hơn. Cửa sổ ngắn hơn, ngược lại. Mỗi thùng kết quả FFT sẽ chứa băng thông tần số khoảng 1 đến 2 lần tốc độ lấy mẫu chia cho chiều dài FFT, tùy thuộc vào hình dạng cửa sổ (hình chữ nhật, von Hann, v.v.), không chỉ là một tần số duy nhất. Nếu toàn bộ đoạn dữ liệu của bạn là văn phòng phẩm (nội dung tần số không thay đổi), thì bạn có thể không cần bất kỳ độ phân giải thời gian nào và có thể đi tới độ phân giải tần số 1 đến 2 Hz trong 1 giây dữ liệu của bạn. Trung bình nhiều cửa sổ FFT ngắn cũng có thể giúp giảm phương sai ước lượng quang phổ của bạn.

+0

Không chắc chắn nếu bạn đã quen thuộc với nó, nhưng tôi đang cố gắng để tạo ra một cái gì đó tương tự như AudioSurf (video này cho thấy một ví dụ tốt về sự công nhận tiến độ khoảng 20 giây trong http://www.youtube.com/watch?v= 2EsVyEnhxWY). AudioSurf xử lý trước âm thanh thay vì thực hiện nó trong thời gian thực và tôi đã không hoàn toàn chắc chắn như thế nào điều này đã được thực hiện. – XSL

+0

@SSL - Tại sao bạn nhìn vào một FFT chỉ có 1 giây dữ liệu để nhận biết tiến độ? Hoặc nếu điều này là về một cái gì đó vượt ra ngoài câu hỏi ban đầu của OP, có lẽ bạn nên hỏi câu hỏi mới của riêng bạn trên SO. – hotpaw2

+0

Nó đã vượt ra ngoài câu hỏi ban đầu, nhưng tôi đã tò mò về điều tương tự như OP. Tôi không cần thông tin ngay bây giờ, vì vậy tôi sẽ tạo một chủ đề mới khi tôi băng qua cây cầu đó. – XSL

2

Lựa chọn tính FFT trên toàn bộ tập dữ liệu (trong trường hợp OP, 44100 mẫu đại diện cho 1 giây dữ liệu) hoặc có thực hiện chuỗi FFT trên các tập con nhỏ hơn của tập dữ liệu đầy đủ hay không, phụ thuộc vào dữ liệu và vào mục đích dự định của FFT.

Nếu dữ liệu tương đối tĩnh trên toàn bộ tập dữ liệu, thì một FFT trên toàn bộ tập dữ liệu có lẽ là tất cả những gì cần thiết.

Tuy nhiên, nếu dữ liệu là động năng động trên tập dữ liệu, thì nhiều FFT trượt trên các tập con nhỏ của dữ liệu sẽ tạo ra sự biểu diễn tần suất thời gian chính xác hơn của dữ liệu.

Cốt truyện dưới đây cho thấy phổ công suất của một chiếc ghita acoustic chơi một ghi chú A4. Tín hiệu âm thanh được lấy mẫu tại 44,1 KHz và tập dữ liệu chứa 131072 mẫu, gần 3 giây dữ liệu. Tập dữ liệu này được nhân trước với chức năng cửa sổ Hann.

Guitar spectrum, Hann window, 131072 samples

Cốt truyện dưới đây cho thấy phổ sức mạnh của một tập hợp con của 16.384 mẫu (0-16.383) lấy từ tập dữ liệu đầy đủ của các lưu ý cây guitar acoustic A4. Tập hợp con này cũng được nhân trước với chức năng cửa sổ Hann.

Guitar spectrum, Hann window, 16384 samples

Chú ý cách phân phối năng lượng quang phổ của các tập con là khác nhau đáng kể từ sự phân bố năng lượng quang phổ của tập dữ liệu đầy đủ.

Nếu chúng tôi trích xuất tập hợp con từ tập dữ liệu đầy đủ, sử dụng khung mẫu 16384 trượt và tính phổ công suất của mỗi khung, chúng tôi sẽ tạo hình ảnh tần số thời gian chính xác của tập dữ liệu đầy đủ.

Tài liệu tham khảo:

dữ liệu tín hiệu âm thanh Real, chức năng Hann cửa sổ, âm mưu, FFT, và phân tích quang phổ được thực hiện ở đây:

Fast Fourier Transform, spectral analysis, Hann window function, audio data

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