Hạn chế phổ sản phẩm hài trong phát hiện cao độ


10

Tôi đã thực hiện một thuật toán phát hiện cao độ bằng HPS và tôi đang gặp vấn đề. Tôi là người mới bắt đầu xử lý tín hiệu và trang web này đã giúp tôi trước đây, vì vậy tôi mặc dù tôi nên hỏi.

Đối với các nốt cao hơn ( eg. >C6:1046.50hz) Tôi bắt đầu nhận dữ liệu rác từ HPS. Cao độ càng cao, tôi càng nhận được nhiều rác (bởi rác tôi có nghĩa là các tần số không phải là lỗi quãng tám cũng như sóng hài và khoảng 1Hz-20Hz)

Những gì tôi đã quan sát theo kinh nghiệm:

  1. kết quả là tồi tệ nhất đối với các nốt cao hơn, nếu mức cơ bản cao hơn A6 hoặc hơn, tôi chỉ nhận được dữ liệu rác.

  2. FFT hoạt động tốt ngay cả đối với âm vực rất cao, (ý tôi là, đỉnh của nó thể hiện cơ bản hoặc một trong những sóng hài của nó, nhưng không phải rác)

  3. nếu tôi giảm số lượng sóng hài tôi xem xét cho HPS, rác sẽ giảm đi, nhưng điều đó làm cho việc phân biệt giữa cơ bản và sóng hài khó hơn.

Đây là thuật toán của tôi:

->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS

Bất kỳ trợ giúp được đánh giá cao!

CẬP NHẬT 1: Vì vậy, có một vài điều nữa tôi muốn thêm:

  1. Tốc độ mẫu tôi đang ghi là 44100 Hz
  2. Tôi đã quan sát thấy rằng hành vi này hầu như không thể nhìn thấy trên một cây đàn guitar, nhưng rất rõ ràng trên một cây đàn piano kỹ thuật số (cho cùng một nốt nhạc được chơi)
  3. Đây là thuật toán hps của tôi, có lẽ ai đó có kinh nghiệm lớn hơn có thể phát hiện ra một vấn đề.

    int hps(float* spectrum, int spectrumSize, int harmonics) {
    
    int i, j, maxSearchIndex, maxBin;
    maxSearchIndex = spectrumSize/harmonics;
    
    maxBin = 1;
    for (j=1; j<=maxSearchIndex; j++) {
        for (i=1; i<=harmonics; i++) { 
            spectrum[j] *= spectrum[j*i];
        }
        if (spectrum[j] > spectrum[maxBin]) {
            maxBin = j;
        }
    }
    
    // Fixing octave too high errors    
    int correctMaxBin = 1;
    int maxsearch = maxBin * 3 / 4;
    for (i=2; i<maxsearch; i++) {
        if (spectrum[i] > spectrum[correctMaxBin]) {
            correctMaxBin = i;
        }
    }
    if (abs(correctMaxBin * 2 - maxBin) < 4) {
        if (spectrum[correctMaxBin]/spectrum[maxBin] > 0.2) {
            maxBin = correctMaxBin;
        }
    }
    
    return maxBin;
    }
    

1
Tỷ lệ mẫu của bạn là gì? Bạn đã có bộ lọc khử răng cưa nào trước ADC?
Martin Thompson

Tốc độ mẫu ghi âm của tôi là 44100 Hz, xin lỗi tôi đã không đề cập đến nó trước đây.
Valentin Radu

1. Bạn cần vẽ sơ đồ phổ trung gian và các sản phẩm được sử dụng trong tính toán HPS và xem nó nhận được các giá trị sai từ đâu. 2. Guitar và piano là không điều hòa , điều này sẽ khiến các đỉnh không xếp hàng hoàn hảo. Không chắc có bao nhiêu hiệu ứng này sẽ có, nhưng HPS giả định quang phổ hài hòa hoàn hảo.
endolith

Câu trả lời:


3

Có thể có quá ít các hạt điều hòa có mặt trong tín hiệu ở các cao độ này. Thuật toán HPS khá đơn giản và dựa vào các hài bậc trên để tiếp tục xếp chồng lên nhau cho đến khi cơ bản xuất hiện từ nền. Tất nhiên, chúng ta nên tự hỏi, tỷ lệ lấy mẫu của bạn là gì? Nếu là 8000 hz, thì chỉ có đủ 3 sóng hài của 1000 hz ...


Tôi đang ghi âm ở mức 44100 Hz, nhưng câu trả lời của bạn vẫn khiến tôi suy nghĩ về nó. Có lẽ thứ gì đó liên quan và tôi nên quyết định xem có bao nhiêu sóng hài trong hps của mình tùy thuộc vào số lượng đỉnh tôi tìm thấy trong FFT ban đầu của mình. Một điều khác mà tôi đã quan sát là nó hoạt động tốt hơn với các nhạc cụ dây so với đàn piano điện của tôi, điều này có thể là do các giai điệu là tuần trong trường hợp của piano?
Valentin Radu

@mindnoise: Các nhạc cụ dây cung là hài hòa, trong khi các nhạc cụ dây gảy hoặc đánh có en.wikipedia.org/wiki/Inharmonicity . Không chắc chắn nếu đó là một phần của vấn đề
endolith

@endolith có thể đặc biệt bởi vì: "Dây đàn hồi càng ít (nghĩa là chúng càng ngắn, dày và cứng hơn), chúng càng thể hiện tính không điều hòa ". và tôi đang nhận được lỗi chính xác trên các loại chuỗi đó (ghi chú cao). Trên thực tế, cơ bản luôn là tần số mạnh nhất trong FFT của tôi khi xảy ra lỗi, do đó, nó chắc chắn phải thực hiện với thuật toán sóng hài hoặc thuật toán hps, tuy nhiên tôi không chắc tại sao tôi lại nhận được rác 20-50hz cho mức cơ bản 1500 hz. sẽ đăng thuật toán hps.
Valentin Radu

1
@mindnoise: "Tính không ảnh hưởng phần lớn đến các nốt thấp nhất và cao nhất trong piano ... Các dây thấp nhất, phải dài nhất, bị giới hạn nhất bởi kích thước của đàn piano. Người thiết kế một cây đàn piano ngắn buộc phải sử dụng Các dây dày để tăng mật độ khối và do đó bị đẩy vào trạng thái không điều hòa. Các dây cao nhất phải chịu sức căng lớn nhất, nhưng cũng phải mỏng để cho phép mật độ khối thấp. Sức mạnh hạn chế của thép buộc người thiết kế đàn piano phải sử dụng rất ngắn. các chuỗi có bước sóng ngắn do đó tạo ra sự không điều hòa. "
endolith

2

Đối với một số nhạc cụ, số lượng sóng hài đáng kể được tạo ra có thể thay đổi trên các phạm vi cao độ khác nhau. Các phần của các nốt thấp nhất và cao nhất đối với một số nhạc cụ vật lý có thể thể hiện tính không điều hòa lớn hơn. Số lượng sóng hài có thể nằm dưới ngưỡng cắt lọc bộ lọc bí danh dưới Fs / 2 chắc chắn sẽ thấp hơn đối với các nốt rất cao. Công cụ ước tính cao độ HPS của bạn mdy muốn tính đến các yếu tố đó.

Sự tấn công thoáng qua của một số nhạc cụ có thể tạo ra một dải nhiễu phổ aharmonic có thể trùng với vùng tìm kiếm HPS của một số nốt hoặc các sóng hài đáng kể của chúng.

Có khả năng, các âm bội có tần số rất cao thậm chí có thể bao quanh Fs / 2 nếu bộ lọc thông thấp trước bộ ADC âm thanh không có độ suy giảm dải tần đủ tốt.

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.