Mostrando postagens com marcador som. Mostrar todas as postagens
Mostrando postagens com marcador som. Mostrar todas as postagens

segunda-feira, 17 de outubro de 2011

O que é amostra em áudio digital?

O som é uma onda mecânica, com os conceitos de amplitude (distância vertical entre o ponto máximo ou mínimo e o de equilíbrio), de comprimento de onda (distância percorrida pela onda durante uma oscilação), de frequência (número de oscilações por unidade de tempo) e de período (tempo decorrido numa oscilação).

Áudio digital é a representação computadorizada do som real. Para o som ser processado em um computador, o áudio analógico precisa ser convertido em dados digitais. A qualidade do áudio é determinada pela taxa de amostragem (sample rate) e pela profundidade de bits (bit depth), ou resolução. Quanto maior a taxa de amostragem e a profundidade de bits, melhor a qualidade do áudio, pois as amostras representam a onda analógica em valores bem próximos.

Amostras com tamanho de 4 bits, 16 valores

Uma amostra é uma informação sonora em um instante do som. Cada amostra representa a amplitude da onda no instante. A profundidade de bits, ou resolução, refere-se a quantidade de bits usada para representar cada amostra, ou seja, a quantidade de informação que uma amostra pode armazenar. Uma amostra de apenas um bit pode ser representada por apenas dois valores, 0 ou 1, e um áudio de CD, com uma resolução de 16 bits, possui uma amostra que pode ser representada por 65.536 valores distintos.

A taxa de amostragem é a quantidade de amostras por unidade de tempo, geralmente medida em Hertz (ciclos por segundo). Um áudio de CD possui 44.100 Hz, então cada segundo de som contém 44.100 amostras.

A taxa de bits (bit rate) é o número de bits processados por unidade de tempo. A taxa de bits é medida em bits por segundo (bps). O áudio de CD, com 44,1 kHz, 16 bits e 2 canais, possui uma taxa de bits de 44.100 x 16 x 2 = 1.411.200 ou 1411 kbps:

Taxa de bits = (taxa de amostragem em Hz) x (profundidade de bits) x (número de canais)

Quanto maior a resolução e a taxa de amostragem, maior será o arquivo que armazena o áudio digital. Para calcular o tamanho em bytes de um arquivo pode-se usar a seguinte fórmula:

Tamanho = (taxa de amostragem em Hz) x (profundidade de bits)/8 x (número de canais) x (tempo em segundos)

Em um CD onde o áudio é armazenado com 44,1 kHz, 16 bits e 2 canais, um minuto de música ocupa aproximadamente 10 megabytes de espaço:

(44.100 Hz) x (16 bits)/8 x (2 canais) x (60 segundos) = 10.584.000 bytes.

terça-feira, 13 de abril de 2010

Teclado musical para PC speaker

Até o início dos anos 90, os micro-computadores compatíveis com o IBM PC utilizavam o PC speaker para reproduzir músicas polifônicas ou efeitos sonoros. Com a criação das placas de som, capazes de reproduzirem sons complexos independentemente da CPU, o PC speaker ficou com seu uso basicamente no processo de inicialização da máquina ou em terminais em modo texto, para comunicação de códigos de erro, avisos etc.

O PC speaker cria ondas sonoras usando o Intel 8253/8254, um chip Temporizador de Intervalo Programável (Programmable Interval Timer, PIT). O PIT é o mais antigo temporizador usado nos IBM PC compatíveis. É usado para execução de funções de contagem e cronometragem através de um oscilador de cristal de 1,193182 MHz e contém três contadores: o contador 0 é usado pelo sistema operacional para o tempo do sistema; o contador 1 foi usado historicamente para a RAM; e o contador 2 é usado pelo PC speaker. Nos PCs x86 modernos o PIT não está mais incluído em um chip separado, sua funcionalidade está incluída no chipset "southbridge" da placa mãe.

O programa abaixo explora um recurso disponível nos terminais que é a reprodução de "beep" pelo PC speaker. A função ioctl(), da linguagem C, fornece uma interface para a manipulação do terminal e o argumento "KIOCSOUND" desta função gera um som no PC speaker.

O código fonte apresentado a seguir é uma versão bem simplificada e foi baseado no programa Beep (http://www.johnath.com/beep/). Contém apenas o necessário para a reprodução dos sons e com uma interface básica para o usuário. Está adequado para ser compilado no ambiente Linux. Por razões de segurança do sistema, provavelmente somente o root tem permissão de acesso ao dispositivo "/dev/sonsole", sendo assim, um usuário comum não conseguirá reproduzir som, a não ser que faça algumas alterações no ambiente. Segue o código:

/*
  Teclado musical para o speaker interno, em ambiente Linux.
  Compilar com o camando: gcc teclado-musical.c -o teclado-musical
*/

#include <fcntl.h>       /* O_WRONLY */
#include <stdio.h>       /* fprintf, stderr, printf */
#include <stdlib.h>      /* exit */
#include <unistd.h>      /* STDIN_FILENO */
#include <linux/kd.h>    /* KIOCSOUND */
#include <termios.h>     /* ICANON, ECHO, TCSANOW */

#define CLOCK_TICK_RATE 1193182  /* Frequência do oscilador do chip i8254
da placa mãe, em Hz */
#define DURACAO_PADRAO  200  /* Em milisegundos */

#define DO  262  /* Frequências das notas */
#define RE  294
#define MI  330
#define FA  349
#define SOL 392
#define LA  440
#define SI  494

#define ESC 27  /* Valor decimal ASCII da tecla de saída do programa */

char meugetch() {  /* Função que substitui o getchar() para não emitir echo
na tela e ser necessário o <enter> */
  
  struct termios tant, tnovo; /* Cria as variáveis com a estrutura termios */
  
  char ch;
  
  tcgetattr( STDIN_FILENO, &tant );  /* Backup dos atributos do terminal
  atual */
  tnovo = tant;  /* Cópia dos atributos atuais para um novo terminal */
  tnovo.c_lflag &= ~( ICANON | ECHO );  /* Desativa caracteres especiais
  e o echo no modo local */
  tcsetattr( STDIN_FILENO, TCSANOW, &tnovo );  /* Usa imediatamente os
  novos atributos */
  ch = getchar();  /* Lê um caractere do teclado */
  tcsetattr( STDIN_FILENO, TCSANOW, &tant );  /* Usa de volta os
  atributos anteriores */
  
  return ch;
}

void toca_nota(int freq, int duracao) {  /* Reproduz o som no console */

  int console_fd;  /* Se a variável receber -1 significa que o arquivo não
  pode ser aberto */

  if((console_fd = open("/dev/console", O_WRONLY)) == -1) {  /* Abre o
    console para somente escrita e checa se não houve erro */
    fprintf(stderr, "Impossivel abrir /dev/console para escrita.\n");
    /* Imprime na saída de erro */
    perror("open");  /* Imprime a mensagem de erro na saída de erro
    padrão */
    exit(1);  /* Saída com erro */
  }

  if(ioctl(console_fd, KIOCSOUND, (int)(CLOCK_TICK_RATE/freq)) < 0) {
    /* Gera o som no console */
    perror("ioctl");  /* Imprime a mensagem de erro na saída de erro
    padrão */
  }
  
  usleep(1000*duracao);  /* Tempo de espera para a duração do som */
  ioctl(console_fd, KIOCSOUND, 0);  /* Encerra o som */
  close(console_fd);  /* Fecha o uso da escrita no console */

}

int main() {
  
  char tecla;

  printf("Digite teclas zxcvbnm para notas\nou ESC para sair\n");
  do{
    tecla = meugetch();
    switch(tecla){
      case 'z':
         toca_nota(DO,DURACAO_PADRAO);
         break;
      case 'x':
         toca_nota(RE,DURACAO_PADRAO);
         break;
      case 'c':
         toca_nota(MI,DURACAO_PADRAO);
         break;
      case 'v':
         toca_nota(FA,DURACAO_PADRAO);
         break;
      case 'b':
         toca_nota(SOL,DURACAO_PADRAO);
         break;
      case 'n':
         toca_nota(LA,DURACAO_PADRAO);
         break;
      case 'm':
         toca_nota(SI,DURACAO_PADRAO);
         break;
    }
  }while(tecla != ESC);
  
  return 0;
}

A função meugetch() não é necessária para a reprodução de som pelo PC speaker, o que ela faz é tratar a entrada pelo teclado para que não seja necessário pressionar a tecla Enter em cada nota. Caso prefira, com a biblioteca ncurses também é possível aprimorar esta entrada pelo teclado.

sábado, 24 de outubro de 2009

A onda sonora

O som, ou onda sonora, é definido como uma onda mecânica tridimensional, pois necessita de um meio material para se propagar e é capaz de se propagar em todas as direções. O som não se propaga no vácuo.

Nesta propagação acontece compressões e rarefações em propagação do meio, de forma longitudinal. Quando passa, a onda sonora não arrasta as partículas de ar, por exemplo, apenas faz com que estas vibrem em torno de sua posição de equilíbrio.

A audição humana consegue captar freqüências de ondas sonoras que variam entre 20Hz e 20000Hz, aproximadamente. São denominadas ondas de infra-som, as ondas de freqüência menor que 20Hz, e ultra-som as de freqüência acima de 20000Hz.

A velocidade do som depende, entre outros fatores, do meio de propagação. A velocidade nos sólidos é maior que no líquidos e nos líquidos é maior que nos gases. Na água é aproximadamente igual a 1450m/s e no ar à 20°C é 343m/s. A propagação do som em meios gasosos depende fortemente da temperatura do gás.

Como trata-se de onda então possui alguns conceitos. Em uma oscilação, a amplitude é a distância medida na vertical entre o ponto máximo ou mínimo e o de equilíbrio. A frequência é o número de oscilações por unidade de tempo e período é o tempo decorrido numa oscilação. O comprimento de onda é a distância percorrida pela onda durante uma oscilação.

A onda sonora possui algumas características como a sua altura, intervalo e timbre. A altura do som depende apenas de sua frequência, sendo definida como a diferenciação entre grave e agudo. Um tom de maior freqüência é agudo e um de menor é grave.

Os intervalos entre dois sons são dados pelo quociente entre suas frequências. Como o intervalo é um quociente entre duas medidas de mesma unidade, este não tem dimensão. Na música é dada uma nomenclatura para cada intervalo, por exemplo o intervalo acústico de uma quarta possui a razão de frequência 4:3 e as notas musicais de mesmo nome são separadas por um intervalo de uma oitava, 2:1.

O timbre de um som é a característica que permite diferenciar dois sons de mesma altura e mesma intensidade, mas que são emitidos por instrumentos diferentes. Assim uma música executada por um violino e um piano se diferencia pelo timbre.

A intensidade está relacionada com a amplitude da onda sonora e é a qualidade que nos permite caracterizar se um som é forte ou fraco e depende da energia que a onda sonora transfere. Uma maior amplitude é um som mais forte, com mais energia e ouvido a maior distancia da fonte sonora. Uma menor amplitude é um som mais fraco, com menos energia e ouvido a uma menor distancia. Conforme um observador se afasta de uma fonte sonora, a intensidade sonora ou nível sonoro diminui logaritmicamente.

A unidade utilizada para o nível sonoro é o Bel, mas como esta unidade é grande comparada com a maioria dos valores de nível sonoro utilizados no cotidiano, seu múltiplo usual é o decibel (dB), de maneira que 1B = 10dB.

Na propagação do som observam-se os fenômenos gerais da propagação ondulatória. Devido à sua natureza longitudinal, o som não pode ser polarizado e sofre os fenômenos de difração, reflexão, refração, interferência e efeito Doppler.

A difração é a propriedade de contornar obstáculos. Ao encontrar obstáculos à sua frente, a onda sonora continua a provocar compressões e rarefações no meio em que está se propagando e ao redor de obstáculos envolvidos pelo mesmo meio. Desta forma, consegue contorná-los. A difração depende do comprimento de onda.

A reflexão do som obedece às leis da reflexão ondulatória nos meios materiais elásticos. Quando uma onda sonora encontra um obstáculo que não possa ser contornado, ela "bate e volta". A reflexão do som ocorre em superfícies cuja extensão seja grande em comparação com seu comprimento de onda. A reflexão, por sua vez, determina novos fenômenos conhecidos como reforço, reverberação e eco.

Quando o som breve direto atinge o tímpano dos nossos ouvidos, ele o excita. A excitação completa ocorre em 0,1 segundo. Se o som refletido chegar ao tímpano antes do décimo de segundo, o som refletido reforça a excitação do tímpano e reforça a ação do som direto. É o fenômeno do reforço.

Na reverberação, o som breve refletido chega ao ouvido antes que o tímpano, já excitado pelo som direto, tenha tempo de se recuperar da excitação, a fase de persistência auditiva. Desta forma, começa a ser excitado novamente, combinando duas excitações diferentes. Isso ocorre quando o intervalo de tempo entre o ramo direto e o ramo refletido é maior ou igual a zero, porém menor que 0,1 segundo. O resultado é uma confusão auditiva, o que prejudica o discernimento tanto do som direto quanto do refletido.

No eco, o som breve refletido chega ao tímpano após este ter sido excitado pelo som direto e ter-se recuperado dessa excitação. Depois de ter voltado completamente ao seu estado natural, onde completou a fase de persistência auditiva, começa a ser excitado novamente pelo som breve refletido. Isto permite discernir perfeitamente as duas excitações.

A refração do som obedece às leis da refração ondulatória. Este fenômeno caracteriza o desvio sofrido pela frente da onda quando ela passa de um meio para outro, cuja elasticidade, ou compressibilidade para as ondas longitudinais, seja diferente. Um exemplo seria a onda sonora passar do ar para a água. Quando uma onda sonora sofre refração, ocorre uma mudança no seu comprimento de onda e na sua velocidade de propagação. Sua frequência, que depende apenas da fonte emissora, se mantém inalterada.

A interferência é a conseqüência da superposição de ondas sonoras. Quando duas fontes sonoras produzem, ao mesmo tempo e num mesmo ponto, ondas concordantes, seus efeitos se somam, mas se essas ondas estão em discordância, isto é, se a primeira produz uma compressão num ponto em que a segunda produz uma rarefação, seus efeitos se neutralizam e a combinação desses dois sons provoca o silêncio.

O efeito Doppler é um efeito descrito como uma característica observada em ondas emitidas ou refletidas por fontes em movimento relativo ao observador. Para ondas sonoras, o efeito Doppler constitui o fenômeno pelo qual um observador percebe freqüências diferentes das emitidas por uma fonte e acontece devido à velocidade relativa entre o a onda sonora e o movimento relativo entre o observador e/ou a fonte.

Supondo que o observador esteja em repouso e a fonte se movimente. Caso a fonte esteja se aproximando do observador, há um encurtamento do comprimento da onda, relacionado à velocidade relativa, e a freqüência real será menor que a observada. Caso a fonte esteja se afastando do observador, há um alongamento aparente do comprimento de onda.

Supondo que a fonte esteja em repouso e o observador se movimente. Caso o observador se aproxime da fonte, em um mesmo intervalo de tempo ele encontrará mais frentes de onda do que se estivesse parado. Assim a frequência observada deverá ser maior que a frequência emitida pela fonte. Neste caso, o comprimento de onda não é alterado, mas a velocidade de propagação é ligeiramente aumentada.

No caso em que o observador se afasta da fonte, em um mesmo intervalo de tempo ele encontrará menor número de frentes de onda do que se estivesse parado. Assim a frequência observada deverá ser menor que a frequência emitida pela fonte. A dedução do cálculo da frequência observada será análoga ao caso anterior, no entanto a velocidade de propagação é ligeiramente reduzida.