2012-05-04 2 views
0

현재 2 년째 프로젝트를 진행 중입니다. Java에서 튜너 코드를 작성해야합니다. 나는 기타 튜너를 선택했다.스펙트로 그램의 피크 찾기

인터넷에서 살펴본 후 Java 코드에서 FFT를 찾았습니다. 나는 이것을 약간 바꾸고 그것을 이해하고 그것을 시험했다. 나는 그것이 잘 작동한다는 것을 안다. (나는 그것의 그래프를 만들었고 간단한 사인 함수를 사용하여 다른 봉우리를 보았다.)

이제 기본 주파수를 찾으려고합니다. 내가 이해하는 바에 따르면,이 빈도는 첫 번째 피크에 의해 주어집니다.

따라서 필자는 FFT의 처음 5 개 봉우리를 찾아 색인으로 나에게 제공하는 방법을 만들고 싶습니다.

나는 처음 엔 두 개의 2 개씩을 내 스펙트로 그램과 비교하고, 기호가 바뀌면 피크가 있다는 것을 알았습니다. 이 방법은 이상적인 신호 (잡음이없는)에서 훌륭하게 작동합니다. 그러나 소음을 추가하면 완전히 쓸모 없게됩니다.

나는 자바에서 실제로 나쁘다. (실제로 나는이 프로젝트로 시작했다. 기본적으로 위에서 설명한 간단한 기능은 나의 마스터 피스이다.

아무도 도와 줄 수 있습니까? 나는 정말로 그것을 바르게 평가할 것이다! :) 미리 감사드립니다!

멋진 하루 보내십시오!

fireangel

+0

피치가 FFT 피크 주파수가 아닙니다. 피치 주파수가 첫 번째 피크 또는 피크가 아닐 수 있습니다. 특히 기타의 낮은 현에서 녹음 된 사운드의 경우. – hotpaw2

+0

가능한 dup : http://stackoverflow.com/questions/8699360/audio-analysis-frequency-vs-pitch – hotpaw2

+0

감사합니다. hotpaw2 대답 해주세요. 나는 또한 피치 개념을 생각해 냈다. 내가 이해 한 바에 따르면, 피치는 주파수와 연결되어 있으므로 주파수를 찾는 것이 내게 피치를 줄 수 있다고 생각했습니다. – fireangel3000

답변

0

내가 가장 좋은 건, 배열로 모든 값로 읽을 그들을 실행하고 '부드러운'그들이 어떤 종류의 롤링 평균을 사용하는 것입니다라고 말하고 싶지만.

이후에는 훨씬 더 부드러운 곡선을 보입니다. 이 곡선을 사용하여 피크를 찾은 다음 원래 데이터로 돌아가 피크 인덱스를 사용하여 실제 피크를 찾습니다.

의사 :

// Your raw data 
int[] data = getData(); 

// This is an array to hold your 'smoothed' data 
int[] newData = new int[data.length]; 

// Iterate over your data, smooth it, and read it into your smoothed array 
for (i < data.length) { 
    newData[i] = (data[i-2] + data[i-1] + data[i] + data[i+1] + data[i+2])/5; 
} 

// Use your existing peak finding function on your smoothed data, and get 
// another array of the indexes your peaks occur. 
int[] peakIndexes = yourPeakFindingFunction(newData); 

// Create an array to hold your final values. 
int[] peakValues = new int[peakIndexes.length]; 

// Iterate over your peak indexes and get the original data's value at that location. 
for(i < peakIndexes.length) { 
    peadValues[i] = data[peakIndexes[i]]; 
} 

매우 기본적이고 매우 무차별하지만 할당에 대한 올바른 궤도에 당신을 얻을 것이다.

데이터를 부드럽게하는 알고리즘을 사용하여 대표적으로 표현하고 평활화 된 데이터가 나타내는 위치에서 실제 피크를 찾습니다 (정확한 것은 아님).

+0

안녕하세요 Charles. 답변에 많은 감사드립니다. 제가 올바르게 이해한다면, 당신이하는 평활화는 원시 데이터의 5 가지 값의 평균값을 취하는 것입니다. 이와 같이 소음에서 비롯되는 모든 작은 봉우리들은 하나의 진정한 봉우리로 인해 줄어들 것입니다. 그 맞습니까? 그러나 내가 이해하지 못하는 것은 첫 번째 봉우리를 찾은 후에 내 진정한 봉우리의 색인에 해당하지 않는 봉우리의 색인을 얻을 것입니다. 그리고 나는 진짜 하나를 되 찾는 방법을 모르겠다. ... – fireangel3000

+0

기본적으로, 당신은 평평한, 상향, 하향, 피크, 평탄한 라인이 평범한 경향을 나타낼 것이라는 것을 의미하는 작은 스파이크를 평균 내고있다. 기타문제는 원래 데이터에서 '실제'피크의 양 측면에 심한 하향 또는 상향 스파이크가있는 경우 평균 한 방향 또는 다른 방향으로 왜곡 될 수 있으며 인위적으로 어느 방향으로나 피크를 조금씩 움직일 수 있다는 것입니다. 이러한 잡음 피크의 영향을 줄이려면 알고리즘을 사용해야합니다. – Charles

+0

답장 Charles를 보내 주셔서 감사합니다. 저는 실제로 Harmonic Product Spectrum을 사용하여 완전히 새로운 접근 방식을 취했으며 이제는 정상적으로 작동합니다. 도와 주셔서 정말로 고맙습니다! – fireangel3000