문제

내가 시스템 개발에 도움으로 음악가가 수행하는 전사.목표가 수행하는 자동적인 음악 녹음방송(필요가 없다,완벽으로 사용자는 올바른 결함/나중에 실수를)에 단일 기기 모노 녹음이 있습니다.누군가 여기에 경험이 있는 자동적인 음악을 전송?또는 디지털 신호 처리에서 일반?누구의 도움도 크게 감사 상관없이 당신의 배경입니다.

지금까지 나는 사용을 조사의 Fast Fourier Transform 피치 감지,숫자의 테스트에서 모두 MATLAB 고 내 자신의 Java 테스트 프로그램은 다음과 같이 그것을 빠르고 정확한 충분한 업데이트해야 할 책임이 없습니다.의 또 다른 요소는 작업이 필요한 부딪히는 디스플레이의 제작 미디 데이터 시트에서 음악을 형성,하지만 이것은 뭔가가 나는 염려하지 않는 지금이다.

간단히 말해서,내가 찾는 것은 좋은 방법은 참고 개시 검출,즉의 위치에 신호가 새로운 참고가 시작됩니다.로 온셋는 것은 매우 어려울 수 있습을 감지하는 제대로,나는 처음에 시스템을 사용하여 피아노와장합니다.이것은 또한 부분적으로는 사실로 인해 내가 피아노를 연주해야 더 나은 위치에 적절 녹음에 대한 테스트합니다.위에 언급된 대로의 초기 버전은 이 시스템에 사용됩니다 간단하 모노 녹화 가능하게 진행되고 나중에 더 복잡한 입력에 따라 진행합니다.

도움이 되었습니까?

해결책

여기 그래픽 설명하는 임계값 접근 방식을 참고 개시 검색:

alt text

이 이미지는 일반적인 WAV 파일을 가진 세 개별 notes 에서 재생됩니다.빨간색 선을 나타내 선택 신호 임계값,파란색 라인을 나타내는 주의 시작 위치를 반환에 의해 간단한 알고리즘을 표시하는 시작될 때 신호 레벨의 십자가입니다.

으로 이미지를 선택하는 적절한 절대 한계값은 어렵습니다.이 경우에는 첫 번째 주에 집어 정밀한,두번째 참고가 누락이 완전히,그리고 세 번째 주(겨우)가 시작되니다.일반적으로,낮은 임계값의 원인을 선택하는 팬텀 노트 올리기 동안 그것은 당신이 놓치 notes.중 하나 이 문제에 대한 해결책을 사용하여 상대적 임계값을 유발하는 경우 시작 신호를 증가로 특정 비율을 일정한 기간이지만,이는 문제입니다.

간단한 솔루션을 사용하는 것이 다소-직관과는 반대라는 압축(지 않 MP3 압축하는 다른 뭔가가 완전히 에)당신의 웨이브 파일을 처음이다.압축 기본적으로 평평하게 스파이크에서 당신의 오디오 데이터는 다음을 증폭 모든 것 그래서 그 이상의 오디오 근처의 최대값.효과에 위 예제는 다음과 같이 보일 것이다(보여주는 이유이름"압축"이 나타나게 아무 의미-오디오 장비에 그것은 일반적으로 표시된 음의 크기):

alt text

후 압축,절대값 접근 방식이 많이 바뀌 었습니다(하지만 그것은 쉽게 이상의 압축을 따기 시작한 가상의 참고가 시작되는 것과 같은 효과를 낮추는 임계값).많은 파이는 좋은 일을 할 수의 압축,그리고 그것의 더 나은 그들이 작업을 처리-당신은 아마 할 필요한 양의 작업"리"당신의 웨이브 파일을 검출하기 전에 메모에서 어쨌든 그들을.

코딩 기간,WAV 파일로드 메모리가 기본적으로 단지 배열의 두 바이트 정수,여기서 0 은 신호 및 32,767 및 -32,768 을 나타냅니다.가장 간단한 형태의 임계 값 감지 알고리즘은 단지 시작에서 첫 번째 예제를 통해 읽고 편안을 찾을 때까지 보다 큰 값은 임계값입니다.

short threshold = 10000;
for (int i = 0; i < samples.Length; i++)
{
    if ((short)Math.Abs(samples[i]) > threshold) 
    {
        // here is one note onset point
    }
}

실제로 이 끔찍하게,이후 정상적인 오디오가 모든 종류의 일시적인 스파이크 위에 지정된 임계값입니다.하나의 솔루션을 사용하여 실행중인 평균 신호 강도(즉지를 표시 시작할 때까지 평균의 마지막 n 샘플은 위 임계값).

short threshold = 10000;
int window_length = 100;
int running_total = 0;
// tally up the first window_length samples
for (int i = 0; i < window_length; i++)
{
    running_total += samples[i];
}
// calculate moving average
for (int i = window_length; i < samples.Length; i++)
{
    // remove oldest sample and add current
    running_total -= samples[i - window_length];
    running_total += samples[i];
    short moving_average = running_total / window_length;
    if (moving_average > threshold)
    {
        // here is one note onset point 
        int onset_point = i - (window_length / 2);
    }
}

이 모든 필요한 많은 조정 및 재생 설정으로 그것을 얻을 찾기 위해 시작 위치를 WAV 파일의 정확하게,그리고 일반적으로 작동하는 무엇이 하나의 파일에 대한 아주 잘 작동하지 않습니다.이것은 매우 어려운 일이 아니라 완벽하게 해결된 문제는 도메인을 선택했지만,그것을 생각하는 당신이 태클니다.

업데이트:이 그래픽 표시의 세부 사항을 참고 탐지 내가 왼쪽으로,즉 검출할 때 주의 끝:

alt text

노란색 라인을 나타내 오프습니다.면 알고리즘이 검색되었 참고 시작,가정에 참고할 때까지 계속 실행중인 평균 신호 강도 이 값 아래로 떨어(여기에 표시하여 보라색 라인).이것은 물론,다른 소스의 어려움의 경우와 같이 두 개 이상의 주 겹치(동시 발음).

일단 당신이 발견되고 포인트의 각각의 참고할 수 있습제 분석하는 각각의 WAV 파일을 결정하는 데이터의 투구.

Update2:나는 그냥 읽기 당신의 업데이트 질문입니다.피치를 감지해 자동 상관 관계를 훨씬 쉽게 구현하는 것보다 FFT 을 작성하는 경우 처음부터 자신이지만,이미 확인하고 사용 pre-내 FFT 라이브러리,당신은 잘 사용하고 그것은 확실합니다.을 발견하면 시작 및 중지에 위치의 각 주(및 일부를 포함 패딩이 시작과 끝을위한 공격 및 릴리스 부분),할 수 있습 꺼내 각각의 오디오 데이터 전달하는 FFT 기능을 결정합니다.

중 하나는 여기에서 중요한 점은 사용하지 않는 슬라이스의 압축된 오디오 데이터지만,오히려을 사용하여 한 조각의 수정하지 않은 데이터입니다.압축 과정을 왜곡 오디오 및를 생산할 수 있습니다 정확 피치를 읽고 있습니다.

중 하나는 지점에 대한 참고 공격에 시간이 될 수 있습니다 문제가 생각하는 것보다.종종에서 음악을 계기와 느린 공격(처럼 부드럽 신디사이저)을 시작할 것이다 주의 이전 날카로운 공격기(피아노 같은)및 모두트로 사운드는 경우 그들은 그 시작에서는 동일한 시간입니다.만약 당신이 악기 연주에 이 방법으로,알고리즘을 선택은 동일한 시작 시간 모두에 대해 종류의 기기에 좋은에서 WAV-MIDI 관점입니다.

마지막 업데이트 희망(I):잊을 말한 것에 대해 일부를 포함하여 패딩에서 샘플을 초 공격이 있는 부분을 참고-나는 깜빡이는 것은 실제로는 나쁜 생각한 피치를 감지합니다.공격이 부분의 많은 악기를(특히 피아노와 기타 타악기-유형 instruments)과도 포함되지 않는 배수의 기본적인 피치,경향이 있을 것이 나사 피치를 감지합니다.당신은 실제로 시작하려는 각각의 조각 작은 공격한 이유가 이 때문이다.

아,그리고 중요한의 종류: 용어"압축"여기를 참조하지 않 MP3 스타일의 압축.

다시 업데이트:여기에 간단한 함수가 비동적 압축:

public void StaticCompress(short[] samples, float param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        int sign = (samples[i] < 0) ? -1 : 1;
        float norm = ABS(samples[i] / 32768); // NOT short.MaxValue
        norm = 1.0 - POW(1.0 - norm, param);
        samples[i] = 32768 * norm * sign;
    }
}

때 param=1.0,이 기능에 영향을 미치지 않을 것이다.크 param 값(2.0 하는 것이 좋을 것입 광장 정상화 사이에 차이 각 샘플을 최대 피크 값)을 생산할 것이 가장 많이 압축하고 큰 소리로 전체(그러나 엉터리)소리입니다.아래의 값은 1.0 생산 확대 효과가 있다.

다른 하나는 아마 분명한 요점:기록해야 합니다 음악은,non-의성실 때문에 에코는 종종 선택에 의해 이 알고리즘으로 팬텀 노트입니다.

업데이트:여기에는 버전의 StaticCompress 는 것이 컴파일에서 명시적으로 캐스팅 모든 것입니다.이익이 예상한 결과:

public void StaticCompress(short[] samples, double param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        Compress(ref samples[i], param);
    }
}

public void Compress(ref short orig, double param)
{
    double sign = 1;
    if (orig < 0)
    {
        sign = -1;
    }
    // 32768 is max abs value of a short. best practice is to pre-
    // normalize data or use peak value in place of 32768
    double norm = Math.Abs((double)orig / 32768.0);
    norm = 1.0 - Math.Pow(1.0 - norm, param);
    orig = (short)(32768.0 * norm * sign); // should round before cast,
        // but won't affect note onset detection
}

Sorry,내 지식에 점수를 Matlab 은 0 입니다.을 게시한 경우 또 다른 질문에 왜 당신의 Matlab 기능이 정상적으로 작동하지 않는 것에 대한 응답(지에 의해 나).

다른 팁

당신이하고 싶은 것은 종종 호출됩니다 Wav-to-Midi (Google "Wav-to-Midi"). 이 과정에서 많은 시도가 있었으며, 다양한 결과가 있습니다 (참고 시작은 어려움 중 하나입니다. 폴리포니는 다루기가 훨씬 어렵습니다). 기성품 솔루션을 철저히 검색하여 시작하여 허용 가능한 것이 없으면 스스로 작업을 시작하는 것이 좋습니다.

필요한 프로세스의 다른 부분은 MIDI 출력을 전통적인 악보로 렌더링하는 것이지만, 그렇게하는 것은 10 억 제품이 있습니다.

또 다른 대답은 예, 많은 디지털 신호 처리를 수행 한 것입니다 (내 웹 사이트의 소프트웨어 참조 - VB 및 C로 작성된 무한대 소프트웨어 신시사이저)이 문제를 돕는 데 관심이 있습니다. Wav-to-Midi 부분은 실제로 개념적으로 어려운 것이 아니며, 실제로는 실제로 어려운 일이 확실하게 작동하게합니다. 참고 시작은 임계 값을 설정하는 것입니다. 메모 공격 차이를 보상하기 위해 오류를 앞뒤로 쉽게 조정할 수 있습니다. 피치 감지는 실시간으로하는 것보다 녹음에서 훨씬 쉽게 수행 할 수 있으며 자동 상관 루틴을 구현하는 것입니다.

당신은 봐야합니다 mirtoolbox - MATLAB 용으로 작성되었으며 발병 감지기가 내장되어 있습니다. 매우 잘 작동합니다. 소스 코드는 gpl'd이므로 어떤 언어가 자신에게 맞는 언어로 알고리즘을 구현할 수 있습니다. 생산 코드는 어떤 언어를 사용할 것입니까?

이 라이브러리는 오디오 라벨링을 중심으로합니다.

오우 비오

Aubio는 오디오 라벨링을위한 라이브러리입니다. 그 기능에는 각 공격 전에 사운드 파일을 분류하고 피치 감지 수행, 비트 활용 및 라이브 오디오에서 MIDI 스트림 생성이 포함됩니다. Aubio라는 이름은 오타가있는 '오디오'에서 나온 것입니다. 결과에서 여러 전사 오류가 발견 될 수 있습니다.

그리고 나는 발병 감지 및 피치 감지를 위해 행운을 빕니다. C에 있지만 SWIG/PYTHON 래퍼가 있습니다.

또한 도서관의 저자는 페이지에 그의 논문의 PDF를 가지고 있으며, 레이블링에 대한 훌륭한 정보와 배경이 있습니다.

평균 에너지 측정을 사용하여 시간 영역에서 하드 발병을 쉽게 감지 할 수 있습니다.

0에서 n (x^2)의 합계

전체 신호의 덩어리로이를 수행하십시오. 발병이 발생하면 피크가 보일 것입니다 (창 크기는 귀하에게 달려 있고 내 제안은 50ms 이상입니다).

발병 탐지에 대한 광범위한 논문 :

하드 코어 엔지니어의 경우 :

http://www.nyu.edu/classes/bello/mir_files/2005_belloetal_ieeeeee_tsalp.pdf

평범한 사람이 이해하기 쉬운 :

http://bingweb.binghamton.edu/~ahess2/onset_detection_nov302011.pdf

WAV 신호를 시간에 대한 진폭 그래프로 변환하려고 시도 할 수 있습니다. 그런 다음 일관된 시작을 결정하는 방법은 신호의 상승 측면의 X 축과의 변곡점에서 탄젠트의 교차점을 계산하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top