Tôi có thể sử dụng FFT để nhận ra các nốt nhạc trên đàn piano không?


13

Tôi muốn tạo ra một công cụ nhận ra một vài nốt nhạc (tôi biết đây là phát minh lại bánh xe). Vì vậy, tôi sẽ chơi giữa C, D và E trên một cây đàn piano và nó sẽ có thể phân loại các nốt đó. Đây là cách tôi nghĩ rằng tôi nên tiếp cận nó:

  1. Ghi lại một mẫu của tôi đang chơi một ghi chú
  2. Chuyển đổi tín hiệu sang miền tần số bằng cách sử dụng biến đổi Fourier nhanh
  3. Tìm tần số hiện diện nhất (về cơ bản là argmax của dữ liệu miền tần số)
  4. Giả sử rằng tần suất xuất phát từ ghi chú được phát và sử dụng tần số đó để phân loại ghi chú

Tôi chưa thử bất kỳ thứ gì trong số này vì tôi không muốn bắt đầu con đường sai. Vì vậy, về mặt lý thuyết, điều này sẽ làm việc?


Sẽ thật tuyệt nếu bạn có thể cụ thể hơn trong tiêu đề. Tôi đã cố gắng bao gồm một chút về nhận dạng cao độ piano, nhưng tiếng Anh (không phải tiếng mẹ đẻ) của tôi dường như làm tôi thất bại ngày hôm nay.
đường ống

1
@pipe ok Tôi đã thay đổi nó
michaelsnowden

1
"Mẫu" chơi ghi chú của bạn phải là dạng sóng biên độ và thời gian. Về cơ bản, điểm 2 là dư thừa. Để thực hiện tương đối đơn giản, các bước trên của bạn chỉ nên tốt.
dùng2943160

@ user2943160 Tôi đã thêm nó để được rõ ràng. Âm thanh có thể được lưu trữ ở rất nhiều định dạng và thường phải mất một vài lần đọc để đưa nó vào một biên độ tốt theo thời gian.
michaelsnowden

@michaelsnowden: Bạn đang sử dụng thuật ngữ "biên độ" sai: biên độ của một hàm sin là . Nó là mức tối đa của tín hiệu (điện áp, độ dịch chuyển, ...) và nó là một hằng số (hoặc thay đổi từ từ theo tần số). Ý bạn là chỉ tín hiệu . Mặt khác, tôi nghĩ theo "biên độ theo thời gian", ý bạn là đường bao của tín hiệu nhưng theo tôi hiểu thì bạn không biết. y(t)=Asin(ωt)Ay(t)
Sữa đông

Câu trả lời:


23

Khái niệm này là tốt, nhưng bạn sẽ thấy nó không đơn giản trong thực tế.

Cao độ không chỉ đơn giản là giai điệu chiếm ưu thế, vì vậy có vấn đề số 1.

Các thùng tần số FFT không thể đạt được tất cả (hoặc thậm chí nhiều âm) của thang âm nhạc.

Tôi khuyên bạn nên chơi với một chương trình âm thanh (ví dụ: Audacity) bao gồm bộ phân tích FFT và trình tạo âm để cảm nhận về những gì nó có thể (và không thể) làm trước khi bạn cố gắng thực hiện một tác vụ cụ thể bằng FFT.

Nếu bạn chỉ cần phát hiện một vài âm cụ thể, bạn có thể thấy thuật toán Goertzel trở nên dễ dàng và nhanh hơn.

Phát hiện cao độ rất phức tạp và vẫn còn có nghiên cứu đang diễn ra trong lĩnh vực đó. Phát hiện giai điệu khá dễ dàng, nhưng có thể không giúp bạn có được điều bạn muốn.


Nếu chúng ta bắt đầu với giả định rằng các mẫu là của một công cụ cụ thể, vấn đề có thể dễ xử lý hơn một chút, phải không?
mkeith

Điều này có vẻ thực sự tốt. Một câu hỏi tiếp theo là: Thuật toán Goertzel có thể được sử dụng để phát hiện hai ghi chú đang được phát cùng lúc không?
michaelsnowden

Nó có thể được sử dụng để phát hiện các âm đồng thời. Liệu điều đó có đủ để phát hiện các ghi chú đồng thời hay không là một câu hỏi khác nhau và tôi vẫn đang tiếp tục. Tôi có một máy dò ghi chú ghi-ta dựa trên Goertzel mà tôi đã chơi đùa trong nhiều năm.
JRE

2
@mkeith: Sắp xếp Bạn có thể kiểm tra các ghi chú và xem liệu phát hiện âm chiếm ưu thế có phù hợp với một nhạc cụ cụ thể không (và có thể chỉ là các ghi chú quan tâm.) Tuy nhiên, theo tôi biết, không có giải pháp chung nào để phát hiện tất cả các ghi chú từ tất cả các nhạc cụ.
JRE

3

Tôi có thể nói sử dụng cửa sổ quan sát đa phương thức của tín hiệu sẽ tốt hơn. Một cái gì đó dọc theo dòng phân tách sóng con của tín hiệu âm thanh của bạn sẽ cho phép bạn xác định nhiều âm bội bên trong ghi chú. Yup, thực sự là Wavelets, tôi muốn nói là con đường để đi.

Đây là một sự cố rất khái quát về các sóng con là gì, nhưng hãy nghĩ về chúng như một cửa sổ đa biến đổi đi qua tín hiệu của bạn giống như một STFT. Vì vậy, bạn có thể xác định các hình sin khác nhau xảy ra tại các vị trí thời gian khác nhau trong tín hiệu của bạn. Điều này cũng quan trọng vì ghi chú bạn chơi không phải là tín hiệu đứng yên, nó phát và sau đó phân rã theo thời gian. Tôi không phải là một nhạc sĩ, tuy nhiên tôi tin rằng sự thống trị giai điệu thay đổi trong suốt sự phân rã của nốt nhạc.

Tất nhiên sau khi phân tách sóng con, bạn sẽ cần phải thực hiện các thuật toán xác định các ghi chú và âm ngoại vi.

Tôi nghĩ rằng wavelet thực sự giải quyết các vấn đề mà mọi người đang nói về ybout về mặt nhận dạng cao độ.

nếu bạn muốn tìm hiểu cách hoạt động của wavelet thì đây là một whitepaper tuyệt vời do HP phát hành về nó :) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdfGiới thiệu về Wavelets

để triển khai, MATLAB có một công cụ wavelet và tôi chắc chắn có rất nhiều gói khác có sẵn cho các nền tảng như R, v.v.


1

Tôi đoán bạn đang nghĩ đến các nốt được phát ở giữa dải đàn piano (giả sử trong khoảng 200 đến 500 Hz) nhưng ngay cả trong phạm vi đó, một nốt nhạc sẽ có nhiều âm bội, không phải là bội số chính xác của tần số cơ bản và cũng là một lượng nhiễu băng thông rộng đáng kể ở đầu mỗi nốt, và có lẽ ở cuối.

Đối với các nốt lớn ở đầu dưới của dải ghi chú, bạn sẽ thấy rằng rất ít năng lượng âm thanh (dưới 1%) thực sự nằm trong cao độ cơ bản của nốt nhạc.

Một vấn đề khác là một cách giải thích ngây thơ về FFT giả định tín hiệu bạn đang cố gắng phát hiện có biên độ không đổi. Điều đó không áp dụng cho các nốt piano trong đó biên độ thực sự tuân theo một số phân rã theo cấp số nhân - phần ban đầu của phân rã có hằng số thời gian tương đối ngắn, nhưng phần sau có hằng số thời gian dài hơn.

Bạn có thể nghiên cứu tốt hơn các phương pháp biến đổi Fourier trong thời gian ngắn, ví dụ như biến đổi Gabor hoặc các phương pháp dựa trên wavelet.

Lưu ý rằng vì cường độ cơ bản của các nốt liên tiếp tăng khoảng 6% cho mỗi nốt, bạn không nhất thiết cần độ chính xác rất cao trong việc xác định tần số của sóng hài trong âm thanh. Xác định chính xác các nốt nhạc không phải là vấn đề hoàn toàn giống như xác định xem các nốt có đồng điệu chính xác với thang âm nhạc hay không, trong đó tần số có thể cần phải được đo chính xác hơn 0,1%.


0

Vâng, đây là những gì FFT là tất cả về! Để cung cấp cho bạn phổ tần số của dữ liệu bạn cung cấp. Phần khó là các chi tiết thực hiện, như bạn đã đề cập.

Tùy thuộc vào những gì bạn muốn làm, chính xác, thay đổi câu trả lời.

Nếu bạn chỉ muốn phân tích âm nhạc của riêng bạn, đã có sẵn phần mềm để làm điều đó. Bạn có thể xem EQ thể hiện phản hồi (về cơ bản là FFT) hoặc nhận được "EQ âm nhạc" cũng thể hiện các nốt nhạc. Bạn có thể nhận âm thanh sang midi VST để chuyển đổi nội dung bạn phát sang ghi chú midi chính xác. Nếu bàn phím của bạn là midi, chỉ cần bỏ qua VST và ghi âm midi trực tiếp.

Nếu bạn muốn dạy cho mình FFT và cách nó liên quan đến âm nhạc, thì tốt hơn là lấy một cái gì đó như Matlab nơi bạn có thể tính toán FFT của bất kỳ dữ liệu nào. Nó có khả năng ghi và phát lại cùng với việc đọc các tệp wav và như vậy. Những sau đó để được reall dễ sử dụng. Bạn có thể vẽ biểu đồ âm thanh và thực hiện tất cả các loại phân tích khá nhanh nếu bạn biết cú pháp.

Nếu bạn muốn xây dựng một thiết bị để làm một việc như vậy thì nó khá phức tạp. Bạn sẽ cần một uC / dsp / fpga / etc để thực hiện các phép tính. Hầu hết các thiết bị phổ biến đã đi kèm với mã FFT vì vậy bạn sẽ không phải tự viết mã (cũng phức tạp).

Bạn sẽ cần phải xây dựng các mạch và tất cả điều đó. Nó không khó nhưng tùy thuộc vào kinh nghiệm / kiến ​​thức của bạn, nó có thể mất khá nhiều thời gian và có một đường cong học tập dốc. Nó cũng phụ thuộc vào chất lượng của sản phẩm cuối cùng.

Về mặt toán học, một nốt nhạc lý tưởng bao gồm một loạt hình học của "cơ bản".

Giả sử F0 là tần số cơ bản, thì hầu hết các nốt nhạc sẽ được xấp xỉ bởi F (t) + F0 * sum (a_k e ^ (2 ^ k F0 * pi i t)) = F0 + a_1 * F1 + a_2 * F2 +. ...

Các a_k chỉ là thế mạnh của các tần số cao hơn đó là F_k và F_k chỉ là bội số của F0. Nếu a_k = 0 với mọi k, thì chúng ta có một hình sin thuần túy. Cao độ của điều này là dễ dàng để phát hiện. Chỉ cần tìm mức tối đa của FFT và tần số đó là nền tảng của âm = nốt nhạc.

Khi bạn thực hiện FFT, bạn kết thúc với dữ liệu đó và chỉ cần làm toán. Về cơ bản là tính toán.

Tất cả điều đó là tương đối dễ dàng.

Một số vấn đề bạn sẽ phải giải quyết. Lưu ý rằng không phải tất cả trong số này là "giải quyết".

  1. Độ trễ - Nếu bạn định làm bất kỳ loại công cụ thời gian thực nào, điều này có thể trở thành một vấn đề.

  2. Nhiều ghi chú - Rất khó để xác định nhóm các ghi chú vì tất cả các hài âm thêm. Nếu phát A = 440hz và A '= 880hz, hầu hết các sóng hài sẽ chồng lấp. Bạn có thể dễ dàng nhận được A = 440hz, nhưng để có được A '= 880hz thì khó khăn hơn. Khi bạn nghĩ về hợp âm, chạy nhanh, v.v., thì có thể rất khó để có được chính xác tất cả các thông tin (ghi chú). Mặc dù mọi thứ nói chung đều có thể về mặt toán học, bản thân dữ liệu có lỗi và quang sai, và các phương trình được xác định trong một số trường hợp.

  3. Nhiễu - Nhiễu trong tín hiệu có thể cho bạn kết quả giả. Nếu một tiếng ồn âm nhạc xảy ra, nó có thể làm hỏng kết quả của bạn. Các thuật toán tốt hơn sau đó sẽ được yêu cầu = thời gian + tiền bạc + kiến ​​thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.