2009-06-23 3 views
11

나는 이런 모습을하고 싶습니다. 두 가지 색상이 네세 스리가 아닙니다.오디오 데이터를 어떻게 시각화합니까?

audacity on mac http://audacity.sourceforge.net/about/images/audacity-macosx.png

은 이미 두 개의 INT 배열, 왼쪽과 오른쪽 채널에 하나씩 각 스테레오 WAV의 오디오 데이터 (하나 개의 샘플/밀리 초)을 가지고있다. 나는 몇 가지 시도를 해왔지만, 이것들만큼 명확하지 않은 곳에서는 보지 않는다. 나의 시도는 스파이 키 (spikey) 나 컴팩트 한 덩어리에 이른다.

좋은 제안이 있으십니까? 나는 C#에서 일하고 있지만 psuedocode는 괜찮습니다.

우리

  • 함수 DrawLine (색상, X1, Y1, X2, Y2)와
  • 두 INT 어레이 있다고 가정 데이터 오른쪽 [] []를 아이폰에의 L
  • 데이터 값의 왼쪽 32767 ~ -32768 사이

다른 가정을하면 대답에 적어주십시오.

for(i = 0; i < L - 1; i++) { 
    // What magic goes here? 
} 

이것은 the solution Han provided을 적용했을 때의 결과입니다. (단 하나의 채널)
alt text http://www.imagechicken.com/uploads/1245877759099921200.jpg

+0

Audacity는 공개 소스이므로 코드를 살펴볼 수 있습니다. 나는 다음과 같은 것을 가정 할 것이다 ... func getHeight (v) {return abs (v) * 32767/viewArea.height/2); samplesPerPixelColumn = samples.len/viewArea.width; i = 1 ~ viewArea.width {avgV = Avg (samples [i-i + samplesPerPixelColumn]); colHeight = getHeight (avgV); if avgV> = 0 DrawLine (검정, i, viewArea.height/2, i, (viewArea.height/2) + colHeight) else DrawLine (검정, i, viewArea.height/2, i, (viewArea.height/2)) - colHeight); 아마도 거기에서 반올림/범위 처리를 수행해야하지만 그것은 요점이어야합니다. – steamer25

+0

왜 대답하지 않습니까? – Nifle

+1

나는 즉시 도움이 될만한 것을 주려고했지만, 그 중 일부가 꺼져있는 경우에는 downvoted을 얻지 못했습니다. 더 많은 생각 : 수직선 대신 이전 그래프 점과 다음 점 사이에 대각선을 그립니다.또한 충분히 확대하면 샘플 당 여러 픽셀을 갖게됩니다. – steamer25

답변

2

각 픽셀마다 1 개 이상의 샘플이있을 수 있습니다. 단일 픽셀에 매핑 된 각 샘플 그룹에 대해 샘플 그룹의 최소값에서 최대 값까지 (수직) 선분을 그릴 수 있습니다. 픽셀 당 1 샘플 이하로 확대하면 더 이상 작동하지 않으며 '좋은'해결책은 sinc 보간 값을 표시하는 것입니다. DrawLine은 단일 픽셀을 칠할 수 없으므로 최소값과 최대 값이 같을 때 작은 문제가 있습니다. 이 경우에는 아래의 코드와 같이 임의의 위치에서 하나의 화소 화상을 복사 할 수 : Value2Pixel는 (Y 방향)의 화소 값의 샘플 값을 스케일링

double samplesPerPixel = (double)L/_width; 
double firstSample = 0; 
int endSample = firstSample + L - 1; 
for (short pixel = 0; pixel < _width; pixel++) 
{ 
    int lastSample = __min(endSample, (int)(firstSample + samplesPerPixel)); 
    double Y = _data[channel][(int)firstSample]; 
    double minY = Y; 
    double maxY = Y; 
    for (int sample = (int)firstSample + 1; sample <= lastSample; sample++) 
    { 
     Y = _data[channel][sample]; 
     minY = __min(Y, minY); 
     maxY = __max(Y, maxY); 
    } 
    x = pixel + _offsetx; 
    y1 = Value2Pixel(minY); 
    y2 = Value2Pixel(maxY); 
    if (y1 == y2) 
    { 
     g->DrawImageUnscaled(bm, x, y1); 
    } 
    else 
    { 
     g->DrawLine(pen, x, y1, x, y2); 
    } 
    firstSample += samplesPerPixel; 
} 

참고.

0

당신은 이것을 위해 R 언어를 조사하고 싶을 것입니다. 필자는 경험이별로 없지만 주로 통계 분석/시각화 시나리오에 사용됩니다. 당신이 언급 한 것처럼 극단을 제거 할 수있는 스무딩 기능이 없다면 놀랄 것입니다.

그리고 데이터를 가져 오는 데 문제가 없어야합니다. 플랫 텍스트 파일을 읽을 수있을뿐만 아니라 C로 쉽게 확장 할 수 있도록 설계되었으므로 아마도 C# 인터페이스도있을 것입니다.

+0

비트 맵을 그릴 외부 응용 프로그램을 호출하는 것이 효과가 있을지 의심 스럽습니다. 비트 맵을 여러 번 업데이트하고 있습니다. – Nifle

관련 문제