dsp관련 소프트웨어 없나요?

stypr의 이미지

현재 /dev/dsp로 pcm형태의 데이타를 내보내고 있는데 소리가 찌그러져서 나오네요(아주 짭은 단위로)그래서 뭘잘못했는지 분석을 해보고 싶습니다.
장님 코끼리 다리 잡듯이 지금 하고 있는데...
실시간으로 /dev/dsp로 나가는 데이터를 모니터링 해서 그래프 형태로 보여줄수 있는 소프트 웨어는 없을까요?
아니면 low데이터를 처리해주는 거나?

익명 사용자의 이미지

예전에 제가 linux.co.kr에 공개했던 소스입니다.

이것은 정현파를 임의로 가공해서 pcm으로 출력하는 예제입니다.
만든지 벌써 1년이 다 되어 가는데 또 이것을 써먹네요. 개선도 안하고...

여기서 중요하게 보실부분은 몇군데 안되는데
일단 주파수설정,채널수설정,비트폭설정 하는 부분 (ioctl로 하는 부분)을
유심히 보면 되고 write로 dsp에 보내는 부분의 이전부분에서
버퍼에 어떤식으로 파형을 만들어 내는지는 그냥 참고로 보시면
형상학적으로 어떤 그림을 만들어서 넣는거구나 라고 이해하시면 될듯 하네요.

참고로 X-Windows상에서 하신다면 일부 예전의 배포판에서는
X-Windows의 설정중에서 SoundServer를 띄우는 부분이 있는데
이것을 내리고 하셔야 하는 경우가 있습니다.

그리고 일부 시스템에서는 사운드 카드자체에 버퍼가 있어서
소리에 지연이 발생하더군요. (약 1 ~ 5초정도 편차가 있는것을 봤던적이...)
이유는 모르겠습니다. 그냥 현상만 알고 있을뿐....

/*
 Copyright (c) 2002 Information Equipment co.,LTD.
 All Right Reserved.

 Code by JaeHyuk Cho <minzkn@infoeq.co.kr> 
*/

#if !defined(DEF_sound_c)
#define DEF_sound_c "sound.c"

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#include <linux/soundcard.h>

int MZ_SetupDSP(int s_Handle, int s_Channels, int s_Freq);
void MZ_Beep(int s_Second, int s_Freq);
int main(int s_Argc, char **s_Argv);

int MZ_SetupDSP(int s_Handle, int s_Channels, int s_Freq)
{
 int s_Return = (-1);	
 int s_Format;
 s_Format = AFMT_S16_NE;
 if(ioctl(s_Handle, SNDCTL_DSP_SETFMT, &s_Format) != (-1))
 {
  if(s_Format == AFMT_S16_NE)
  {
   if(ioctl(s_Handle, SNDCTL_DSP_CHANNELS, &s_Channels) != (-1))
   {
    if(ioctl(s_Handle, SNDCTL_DSP_SPEED, &s_Freq) != -1)s_Return = s_Freq;
    else fprintf(stderr, "sound.c: MZ_SetupDSP - [ERROR] Can not ioctl SPEED !!!\n");
   }
   else fprintf(stderr, "sound.c: MZ_SetupDSP - [ERROR] Can not ioctl CHANNEL !!!\n");
  }
  else fprintf(stderr, "sound.c: MZ_SetupDSP - [ERROR] s_Format is not support AFMT_S16_NE !!!\n");
 }
 else fprintf(stderr, "sound.c: MZ_SetupDSP - [ERROR] Can not ioctl DSP_SETFMT !!!\n");
 return(s_Return);
}

void MZ_Beep(int s_Second, int s_Freq)
{
 short *s_Sample;
 int s_Handle;
 s_Handle = open("/dev/dsp", O_RDWR);
 if(s_Handle >= 0)
 {
  MZ_SetupDSP(s_Handle, 2, 44100);	 
  s_Sample = (short *)malloc((44100 << 1) * sizeof(short));
  if(s_Sample)
  {
   double s_PI = 0.0, s_Grid;
   int s_Index = 0, s_Level;
   s_Grid = ((double)s_Freq / 44100.0) * (2.0 * M_PI);
   s_Level = (32768 >> 1) - 1;
   for(s_Index = 0;s_Index < 44100;s_Index++)
   {
    *(s_Sample + (s_Index << 1) + 0) = (short)(sin(s_PI) * (double)(s_Level));
    *(s_Sample + (s_Index << 1) + 1) = (short)(-sin(s_PI) * (double)(s_Level));
    s_PI += s_Grid;
    if(s_PI >= (2.0 * M_PI))s_PI = 0.0;
   }
   while(s_Second--)write(s_Handle, (void *)s_Sample, (44100 << 1) * sizeof(short)); 
   free(s_Sample);
  }
  else fprintf(stderr, "%s: %s - [ERROR] s_Sample is null !!!\n", __FILE__, __FUNCTION__);
  close(s_Handle);
 }
 else fprintf(stderr, "%s: %s - [ERROR] Can not open dsp !!!\n", __FILE__, __FUNCTION__);
}

int main(int s_Argc, char **s_Argv)
{
 if(s_Argc >= 3)
 {
  int s_PlayTime;
  int s_Frequency;
  sscanf(s_Argv[1], "%i", &s_PlayTime);
  sscanf(s_Argv[2], "%i", &s_Frequency);
  MZ_Beep(s_PlayTime, s_Frequency /* Hz */);
 }
 else
 {
  fprintf(stdout, "usage: %s <Play second> <Frequency>\n", s_Argv[0]);
  fprintf(stdout, "\tExample: bash# %s 1 1000\n", s_Argv[0]);
 } 
 return(0);	
}

#endif 

/* End of source */ 
cho&#039;s의 이미지

중요한게 rate와 쓰여지는 data간의 sync를 맞추는거 같은데 맞나요?
만약 4096size의 데이타를 연속적으로 받아와서 쓴다면 rate도 4096으로 맞추어야 되는 건가요?

돌아다니는 문서를 보니까 사운드카드에서 지원하는 기본값이 (sampling rate) 22.050(kHz)이나 11.025(kHz), 44.1(kHz, mono), 22.05(kHz, streo)라던데요. 그리고 DVD의 경우는 96kHz이고요.

/dev/dsp에서 주로쓰는값은 이중에 하나만 써야 하는건가요?

아님 받는 데이타의 크기에 맞춰서 sampling rate가 결정되는 건가요?
저의 경우는 4096(Hz)으로 설정하는 건가요?
dsp쪽은 공부해본적이 없어서 전혀 모르겠네요. 현재 음성데이타를 받아서 사이즈를 줄이기 위해 샘플링해서 4096byte를 /dev/dsp에 써주고 있거든요.?
4096으로 하면 약간의 잡음과 함께 이상없이 들리지만 이보다 높게 11025로 주면 소리가 찌그러지내요, 빨라지면서요. 개념적인 설명을 부탁드립니다.

두서 없이 쓴 문장을 여기까지 읽어주셔서 고맙습니다.
여기저기 자료를 봤는데 기초가 없어서 잘 이해가 안가네요.
그럼 받글 기다리겠습니다. 좋은 하루되세요.

익명 사용자의 이미지

떵개 cho wrote:
중요한게 rate와 쓰여지는 data간의 sync를 맞추는거 같은데 맞나요?
만약 4096size의 데이타를 연속적으로 받아와서 쓴다면 rate도 4096으로 맞추어야 되는 건가요?

돌아다니는 문서를 보니까 사운드카드에서 지원하는 기본값이 (sampling rate) 22.050(kHz)이나 11.025(kHz), 44.1(kHz, mono), 22.05(kHz, streo)라던데요. 그리고 DVD의 경우는 96kHz이고요.

/dev/dsp에서 주로쓰는값은 이중에 하나만 써야 하는건가요?

아님 받는 데이타의 크기에 맞춰서 sampling rate가 결정되는 건가요?
저의 경우는 4096(Hz)으로 설정하는 건가요?
dsp쪽은 공부해본적이 없어서 전혀 모르겠네요. 현재 음성데이타를 받아서 사이즈를 줄이기 위해 샘플링해서 4096byte를 /dev/dsp에 써주고 있거든요.?
4096으로 하면 약간의 잡음과 함께 이상없이 들리지만 이보다 높게 11025로 주면 소리가 찌그러지내요, 빨라지면서요. 개념적인 설명을 부탁드립니다.

두서 없이 쓴 문장을 여기까지 읽어주셔서 고맙습니다.
여기저기 자료를 봤는데 기초가 없어서 잘 이해가 안가네요.
그럼 받글 기다리겠습니다. 좋은 하루되세요.

난감하네요. 뭐라고 답변 드려야 되는지...
일단 전 책을 별로 안봅니다.
그냥 파형을 머리속에 생각해서
/usr/include 디렉토리 뒤져서 soundcard.h 를 찾을수 있었고요
그것을 토대로 파형을 모리속에 생각해둔것에 대해서
어떤 요소가 필요할지 생각해보고 만든것 뿐입니다.

그냥 어떤 사람의 도움을 찾기보다
소리에 대한 것을 머리속에 그려보세요.
그러면 이해가 더 빠를거라 사료되옵니다.

챙피하지만 저는 책 잘 안봅니다.
설명도 잘 못합니다.
그냥 머리속에 있던것의 요소를 생각해보고
그냥 /usr/include를 뒤져봅니다.

답이 되었는지

simpid의 이미지

떵개 cho wrote:
중요한게 rate와 쓰여지는 data간의 sync를 맞추는거 같은데 맞나요?
만약 4096size의 데이타를 연속적으로 받아와서 쓴다면 rate도 4096으로 맞추어야 되는 건가요?

돌아다니는 문서를 보니까 사운드카드에서 지원하는 기본값이 (sampling rate) 22.050(kHz)이나 11.025(kHz), 44.1(kHz, mono), 22.05(kHz, streo)라던데요. 그리고 DVD의 경우는 96kHz이고요.

/dev/dsp에서 주로쓰는값은 이중에 하나만 써야 하는건가요?

아님 받는 데이타의 크기에 맞춰서 sampling rate가 결정되는 건가요?
저의 경우는 4096(Hz)으로 설정하는 건가요?
dsp쪽은 공부해본적이 없어서 전혀 모르겠네요. 현재 음성데이타를 받아서 사이즈를 줄이기 위해 샘플링해서 4096byte를 /dev/dsp에 써주고 있거든요.?
4096으로 하면 약간의 잡음과 함께 이상없이 들리지만 이보다 높게 11025로 주면 소리가 찌그러지내요, 빨라지면서요. 개념적인 설명을 부탁드립니다.

두서 없이 쓴 문장을 여기까지 읽어주셔서 고맙습니다.
여기저기 자료를 봤는데 기초가 없어서 잘 이해가 안가네요.
그럼 받글 기다리겠습니다. 좋은 하루되세요.

4096bytes의 PCM 데이터를 갖고 계신가요?
그럼.. 그 PCM 데이터는 몇초짜리인가요?
샘플링 레이트를 4096으로 설정하면 이상없이 들린다고 했으니... 아마도 1초짜리 PCM데이터가 맞는 모양인데...

1초짜리 4096 bytes의 PCM데이터를 11025hz로 재생하려면 interpolation을 통해 데이터를 확장하셔야 합니다.

개념적인 설명을 해달라고 하셨는데..
우리가 음악을 듣는 CD 플레이어는 44.1Khz에 16bit sample을 사용합니다.
그 말은 1초에 해당하는 음악을 44100개의 작은 조각으로 나누고 각 조각의 음 높이를 16비트(0~65535)로 표현한다는 것입니다.

님께서 갖고 계시는 sample은 4096hz, 8bit sample인듯 합니다.
1초에 해당하는 음을 4096개의 조각으로 나누고 각각의 조각 음의 높이를 0~255의 값으로 표현한다는 얘기죠.
4096개의 조각을 1초동안에 DA컨버팅을 해야 1초에 해당하는 음이 들리는 거고... 만약 님처럼 11025hz로 재생하면 11025/4096 = 0.37 초만에 재생이 되버리게 됩니다.

한개의 PCM sample만 재생을 하신다면 그냥 대충 사용하시면 됩니다.
하지만 여러개의 PCM sample을 동시에 재생하는데 각 sample의 sampling rate가 다르다면 DSP의 sampling rate를 고정시켜 놓은 상태에서 각 PCM sample을 interpolation을 통해 DSP의 samping rate로 변환하여 재생해야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.