it-swarm-vi.tech

Nhịp đập mỗi phút từ đầu vào âm thanh thời gian thực

Tôi muốn viết một ứng dụng C # đơn giản để theo dõi âm thanh đầu vào và cho tôi nhịp đập hiện tại (tốt, trung bình cán) mỗi phút.

Tôi đã xem bài viết gamedev này , và điều đó hoàn toàn không có ích. Tôi đã đi qua và cố gắng thực hiện những gì anh ấy đang làm nhưng nó không hoạt động.

Tôi biết rằng phải có rất nhiều giải pháp cho việc này, bởi vì rất nhiều phần mềm DJ làm điều đó, nhưng tôi không gặp may mắn trong việc tìm kiếm bất kỳ thư viện nguồn mở hoặc hướng dẫn nào để tự làm điều đó.

42
Karl

Tính toán một powerpectrum với một cửa sổ trượt FFT: Lấy 1024 mẫu: 

double[] signal = stream.Take(1024);

Đưa nó vào thuật toán FFT: 

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

Bạn sẽ có được một phần thực và một phần tưởng tượng. KHÔNG vứt bỏ phần tưởng tượng. Làm tương tự với phần thực như tưởng tượng. Mặc dù đúng là phần ảo là pi/2 lệch pha so với phần thực, nhưng nó vẫn chứa 50% thông tin phổ.

CHỈNH SỬA:

Tính công suất trái ngược với biên độ để bạn có số cao khi âm lượng lớn và gần bằng 0 khi yên tĩnh:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

Tương tự cho phần tưởng tượng.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

Bây giờ bạn có phổ công suất cho 1024 mẫu cuối cùng. Trong đó phần đầu tiên của phổ là tần số thấp và phần cuối của phổ là tần số Cao.

Nếu bạn muốn tìm BPM trong âm nhạc phổ biến, có lẽ bạn nên tập trung vào âm trầm. Bạn có thể chọn cường độ âm trầm bằng cách tổng hợp phần dưới của phổ công suất. Những số nào sẽ sử dụng phụ thuộc vào tần số lấy mẫu:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

Bây giờ làm tương tự một lần nữa nhưng di chuyển cửa sổ 256 mẫu trước khi bạn tính toán phổ mới. Bây giờ bạn kết thúc với việc tính toán bassInt mật độ cho mỗi 256 mẫu. 

Đây là một đầu vào tốt cho phân tích BPM của bạn. Khi âm trầm yên lặng, bạn không có nhịp và khi âm lớn, bạn có nhịp. 

Chúc may mắn!

26
Hallgrim

Có một dự án xuất sắc tên là Dancing Monkeys, theo thủ tục tạo ra các bước nhảy DDR từ âm nhạc. Một phần lớn của những gì nó làm dựa trên phân tích nhịp (nhất thiết rất chính xác) và bài dự án của họ đi sâu vào chi tiết mô tả các thuật toán phát hiện nhịp khác nhau và sự phù hợp của chúng với nhiệm vụ. Chúng bao gồm các tham chiếu đến các bài báo gốc cho mỗi thuật toán. Họ cũng đã xuất bản mã MATLAB cho giải pháp của họ. Tôi chắc chắn rằng giữa những người bạn có thể tìm thấy những gì bạn cần.

Tất cả đều có sẵn ở đây: http://monket.net/dANCE-monkeys-v2/Main_Page

15
Nick Johnson

Không phải tôi có manh mối làm thế nào để thực hiện điều này, nhưng từ góc độ kỹ thuật âm thanh, trước tiên bạn cần lọc. Hit bass trống sẽ là người đầu tiên để kiểm tra. Bộ lọc thông thấp cung cấp cho bạn mọi thứ dưới 200Hz sẽ cho bạn hình ảnh khá rõ về trống bass. Một cổng cũng có thể cần thiết để dọn dẹp bất kỳ sự lộn xộn nào từ các nhạc cụ khác với âm hài thấp.

Việc tiếp theo để kiểm tra sẽ là lượt truy cập. Bạn sẽ phải EQ cái này. "Vết nứt" từ bẫy là khoảng 1,5kHz từ bộ nhớ, nhưng bạn cần chắc chắn chuyển cổng này.

Thử thách tiếp theo sẽ là tìm ra một thuật toán cho các nhịp đập sôi nổi. Làm thế nào bạn có thể lập trình tìm thấy nhịp 1? Tôi đoán bạn sẽ theo dõi các nhịp trước đó và sử dụng mô hình khớp với thứ này hay thứ khác. Vì vậy, có lẽ bạn cần một vài thanh để tìm chính xác nhịp. Sau đó, có các vấn đề về thời gian như 4/4, 3/4, 6/8, wow, tôi không thể tưởng tượng được những gì sẽ được yêu cầu để làm điều này một cách chính xác! Tôi chắc chắn rằng nó đáng giá một số tiền nghiêm trọng cho các công ty phần cứng/phần mềm âm thanh.

8
Dan Harper

Đây không phải là một vấn đề dễ dàng. Tôi sẽ cố gắng chỉ cung cấp cho bạn một cái nhìn tổng quan.

Những gì bạn có thể làm là một cái gì đó như sau:

  1. Tính độ ồn trung bình (trung bình gốc-bình phương) của tín hiệu qua các khối, giả sử, 5 mili giây. (Chưa bao giờ làm điều này trước đây, tôi không biết kích thước khối tốt sẽ là gì.)
  2. Lấy biến đổi Fourier của tín hiệu "bị chặn", sử dụng thuật toán FFT.
  3. Tìm thành phần trong tín hiệu biến đổi có cường độ lớn nhất.

Một biến đổi Fourier về cơ bản là một cách tính toán cường độ của tất cả các tần số có trong tín hiệu. Nếu bạn làm điều đó qua tín hiệu "bị chặn", tần số của nhịp sẽ hy vọng là mạnh nhất.

Có thể bạn cần áp dụng bộ lọc trước, để tập trung vào các tần số cụ thể (như âm trầm) thường chứa nhiều thông tin nhất về BPM.

6
Thomas

Tôi thấy thư viện này dường như có một triển khai khá chắc chắn để phát hiện Nhịp đập mỗi phút . http://soundtouchdotnet.codeplex.com/ /

Nó dựa trên http://www.surina.net/soundtouch/index.html được sử dụng trong khá nhiều dự án DJ http://www.surina.net/soundtouch/appluggest.html

5
eandersson

Trước hết, những gì Hallgrim đang tạo ra không phải là hàm mật độ phổ công suất. Định kỳ thống kê trong bất kỳ tín hiệu nào có thể được đưa ra thông qua chức năng tự tương quan. Biến đổi Fourier của tín hiệu tự tương quan là mật độ phổ công suất. Các đỉnh chiếm ưu thế trong PSD khác với 0 Hz sẽ tương ứng với tính tuần hoàn hiệu quả trong tín hiệu (tính bằng Hz) ... 

1
pete

Tôi khuyên bạn nên kiểm tra thư viện âm thanh BASS và trình bao bọc BASS.NET. Nó có một lớp BPMCount được xây dựng. 

Chi tiết cho chức năng cụ thể này có thể được tìm thấy tại http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm .

0
Matt Williams

Cách dễ dàng để làm là yêu cầu người dùng chạm vào một nút theo nhịp và đếm số lượng vòi chia cho thời gian.

0
Lucius Kwok