2011-02-07 15 views
5

Gần đây tôi hỏi câu hỏi này: How to get the fundamental frequency from FFT? (bạn không thực sự cần phải đọc nó)Làm thế nào để sử dụng cepstral?

tôi nghi ngờ ngay bây giờ nó: cách sử dụng các thuật toán Cepstral?

Tôi không biết cách sử dụng vì ngôn ngữ duy nhất mà tôi biết là ActionScript 3 và vì lý do này tôi có ít tham chiếu về các hàm gốc có trong C, Java, v.v. nên triển khai chúng trên AS. Hầu hết các bài báo là về các thứ tiếng =/ (mặc dù điều, câu trả lời trong ngôn ngữ khác ngoài AS được hoan nghênh, chỉ cần giải thích cách kịch bản làm việc xin vui lòng)

Các bài viết tôi thấy về Cepstral để tìm tần số cơ bản của kết quả FFT nói với tôi rằng tôi nên làm điều này:

tín hiệu → FT → abs() → vuông → log → FT → abs() → cepstrum vuông → điện

về mặt toán học: | F {log (| F {f (t)} | ²)} | ²

Thông tin quan trọng:

  • Tôi đang phát triển một TUNER GUITAR trong flash
  • Đây là lần đầu tiên tôi đối phó với âm thanh tiên tiến
  • Tôi đang sử dụng một FFT để trích xuất thùng tần số từ tín hiệu rằng đạt của người sử dụng micro, nhưng tôi đã bị mắc kẹt trong việc có được tần số cơ bản từ nó

tôi không biết:

  • Làm thế nào để áp dụng một hình vuông trong một ARRAY (tôi có nghĩa là, các dữ liệu mà FFT của tôi mang lại cho tôi là một mảng. Tôi có nên nhân nó một mình không? Gỡ lỗi ActionScript sẽ ném lỗi khi tôi cố gắng fftResults * fftResults)
  • Cách áp dụng "nhật ký". Tôi sẽ không biết cách áp dụng nó ngay cả khi tôi có một con số duy nhất.
  • Sự khác biệt giữa cepstral phức tạp và cepstral điện. Ngoài ra, tôi nên sử dụng những gì? Tôi đang cố gắng phát triển một bộ chỉnh guitar.

Cảm ơn!

Trả lời

1

Có nhiều cách để tìm tần số cơ bản (F0).

Đối với các ngôn ngữ như Java, có nhiều thư viện với các loại thuật toán đã được triển khai (bạn có thể nghiên cứu nguồn của chúng).

  • MFCC (dựa trên cepstral) được triển khai trong Comirva (Nguồn mở).
  • Audacity (beta phiên bản!) (Mã nguồn mở) trình bày cepstrum, autocorellation, tăng cường autocorellation,
  • Yin dựa trên tự tương quan (example)
  • Tìm giá trị tín hiệu tối đa sau khi FFT

Tất cả các thuật toán có thể sẽ rất hữu ích cho bạn.Tuy nhiên cách dễ nhất để có được F0 (một giá trị bằng Hz) sẽ sử dụng Yin.

+0

Các phương pháp này có đủ chính xác để tạo bộ chỉnh sửa guitar không? Ý tôi là ... Tôi cần một độ chính xác thực sự cao! –

+0

Nó phụ thuộc vào nhiều thứ - chất lượng micro, tiếng ồn vv Đôi khi một số thuật toán cho việc denoising cũng có thể cần thiết. Bạn có thể chạy ví dụ Yin đó - đó là ứng dụng thu âm thanh từ micrô và hiển thị f0 - kiểm tra và xác minh bằng bộ chỉnh tần (phần cứng?) Bình thường. – mmatloka

+0

Tôi đọc một nửa số này: http://recherche.ircam.fr/equipes/pcm/cheveign/ps/2002_JASA_YIN_proof.pdf nó có vẻ như là một loại tài liệu nào đó, nhưng nó đang rán bộ não của tôi. Tôi không muốn làm phiền bạn, nhưng bạn sẽ cho tôi biết làm thế nào tôi nên thực hiện các phương trình? Trong tín hiệu, trong một kết quả fft, và làm thế nào? cảm ơn rất nhiều về sự giúp đỡ của bạn! –

6

Lưu ý rằng đầu ra của FFT là một mảng các giá trị phức tạp, tức là mỗi bin = re + j*im. Tôi nghĩ rằng bạn chỉ có thể kết hợp các hoạt động abs và vuông và tính toán re*re + im*im cho mỗi bin. Điều này mang lại cho bạn một giá trị dương duy nhất cho mỗi thùng và rõ ràng là bạn có thể tính giá trị nhật ký cho mỗi thùng khá dễ dàng. Sau đó, bạn cần phải thực hiện một FFT thứ hai trên nhật ký này bình phương dữ liệu và một lần nữa bằng cách sử dụng đầu ra của FFT thứ hai này, bạn sẽ tính toán re*re + im*im cho mỗi thùng. Sau đó, bạn sẽ có một mảng các giá trị postive mà sẽ có một hoặc nhiều đỉnh đại diện cho tần số cơ bản hoặc tần số đầu vào của bạn.

+0

một ví dụ về mảng mà tôi nhận được: [0.123123,0.4809,0.0498356,0.000231,82.31240987,0.1230987 ................. ....................... giá trị 1020, giá trị 1021, giá trị 1022, giá trị 1023, giá trị 1024]. Những giá trị này chỉ là số. Họ không phức tạp, phải không? –

+0

@Lucas: nó phụ thuộc vào những gì FFT cụ thể mà bạn đang sử dụng như thế nào dữ liệu đầu vào và đầu ra được tổ chức. Một số sẽ sử dụng kiểu dữ liệu phức tạp, một số sẽ xen kẽ các phần thực và ảo, và một số sẽ có tất cả các phần thực trong nửa đầu của mảng và phần ảo trong phần thứ hai (hai mảng, hiệu quả) - bạn cần đọc và hiểu các tài liệu cho FFT đã chọn của bạn. –

+0

@PaulR: Lấy FFT trên N mẫu cho N giá trị tương ứng với N/2 số phức (thùng). Nhưng, sau khi tính toán độ lớn vuông, tôi chỉ còn lại với các giá trị N/2 mà trên FFTing một lần nữa chỉ cho N/4 số phức. Điều đó có đúng không? Làm thế nào để tính toán tần số bin sau FFT thứ hai? Bạn có thể sửa/giúp tôi với điều này không? – Ravi

2

Tự tương quan là cách tiếp cận dễ dàng nhất và hợp lý nhất và là nơi tốt nhất để bắt đầu.

Để làm việc này, bắt đầu bằng tự động đơn giản và sau đó, nếu cần, hãy cải thiện nó theo đường viền do YIN cung cấp. (YIN dựa trên sự tự tương quan với các sàng lọc. Nhưng dù bạn có cần những cải tiến này hay không phụ thuộc vào chi tiết tình huống của bạn.) Bằng cách này, bạn có thể học khi bạn đi thay vì cố gắng hiểu toàn bộ điều trong một cảnh quay.

Mặc dù phương pháp tiếp cận FFT cũng có thể hoạt động, chúng hơi khó hiểu hơn một chút. Vấn đề là những gì bạn đang thực sự sau là khoảng thời gian, và điều này không được đại diện bởi FFT. Cơ sở còn thiếu là một ví dụ điển hình về điều này, nếu bạn có 2Hz và 3Hz, thì cơ bản là 1Hz, nhưng không ở đâu trong FFT, trong khi 1Hz là hiển nhiên trong một biểu diễn dựa trên thời gian (ví dụ: tự tương quan). Thêm vào đó, âm bội không nhất thiết là hài hòa, và tiếng ồn, vv ... và tất cả những vấn đề này làm cho nó thường là tốt nhất để bắt đầu với một cách tiếp cận trực tiếp cho vấn đề.

+0

Bạn có biết một số mã tự tương quan để chỉ cho tôi không? Ngoài ra, là autocorrelation dựa trên FFT tại một số điểm? –

+0

Tự tương quan là rất dễ thực hiện, mặc dù chính xác những gì bạn làm sẽ phụ thuộc vào những công cụ bạn có sẵn, và tôi không biết ActionScript. Hầu hết các thư viện làm toán trên mảng có hàm "tương quan", và sau đó chỉ tương quan dữ liệu với chính nó. Nếu bạn không có loại điều này, đây là ví dụ về C++ (http://www.koders.com/cpp/fidEB813F60127CA4FA79CE6ACDF6741303707951AD.aspx?s=include). Nhưng thật dễ dàng để viết của riêng bạn, chỉ cần nhân đối tượng với một phiên bản chuyển của chính nó. – tom10

+0

Đối với phần thứ hai của câu hỏi của bạn: Đôi khi nhanh hơn để tính toán tự tương quan bằng cách sử dụng FFT, nhưng hiện tại, hãy nghĩ về điều này hoàn toàn như một mẹo tính toán. Người ta có thể làm điều đó một trong hai cách, với FFT hoặc không có nó. – tom10