Skip to content
Gwaean (Nicole) edited this page Dec 15, 2024 · 1 revision

Welcome to the Trabalho2-Processamento-de-audio wiki!

Instruções para “montar” o projeto:

Será disponibilizado um “pacote” contendo os seguintes arquivos:

  1. Um arquivo trabalho2.h, contendo as declarações das funções, que deve ser incluído no seu arquivo .c através da diretiva #include.
  2. Arquivos contendo declarações e funções para a manipulação de arquivos no formato Microsoft Wave (.wav): wavfile.c e wavfile.h. Note que as funções do trabalho NÃO PRECISAM acessar o módulo wavfile!
  3. Exemplos de programas para teste e arquivos de áudio demonstrando os resultados produzidos. No Code::Blocks, para compilar e usar no seu programa as funções presentes no arquivo wavfile.c, crie um projeto e adicione o arquivo ao mesmo. Crie outro arquivo .c para as suas funções. Cada arquivo contendo um exemplo de programa contém uma função main, portanto apenas um dos exemplos deve ser incluído no projeto por vez. Recomenda-se também a criação de outros programas para testar as funções.

Sobre as funções do módulo wavfile: Observação: você não precisa compreender o funcionamento do módulo wavfile, mas conseguir utilizá-lo pode ajudar a realizar testes mais avançados. Em particular, a função writeSamplesAsText pode ser útil para depurar o seu programa. O módulo wavfile implementa o tipo WavHeader e um conjunto de funções que podem ser usadas para testar as funções do trabalho. O tipo WavHeader é usado para armazenar informações sobre um arquivo no formato Microsoft Wave (.wav). Ele é implementado como uma struct, um conceito que ainda não vimos em aula. Por enquanto, apenas trate este tipo como um dos tipos primitivos da linguagem C (int, float, etc.), seguindo os exemplos. Para usar o tipo WavHeader e as funções auxiliares, você deve incluir o arquivo wavfile.h, através da diretiva #include, no arquivo .c que usa o tipo ou as funções declaradas. As funções para manipulação de arquivos trabalham apenas com um sub-conjunto do formato Microsoft Wave. Use-as sempre com áudio não comprimido, no formato PCM, com 16 bits por amostra.

int readWavFile (char* filename, WavHeader* header, double** data_l, double** data_r); Abre um arquivo wav e lê o seu conteúdo. Parâmetros: char* filename: arquivo a ser lido. WavHeader* header: parâmetro de saída para os dados do cabeçalho. double** data_l: parâmetro de saída, é um ponteiro para um vetor dinâmico, onde manteremos os dados lidos para o canal esquerdo. O vetor será alocado nesta função, lembre-se de desalocá-lo quando ele não for mais necessário! Se ocorrerem erros, o vetor NÃO estará alocado quando a função retornar. double** data_r: igual ao anterior, mas para o canal direito. Se o arquivo for mono, o vetor será == NULL. Valor de Retorno: o número de amostras do arquivo, 0 se ocorrerem erros.

int writeWavFile (char* filename, WavHeader* header, double* data_l, double* data_r); Escreve os dados de áudio em um arquivo wav. Esta função NÃO testa os dados do cabeçalho, então dados inconsistentes não serão detectados. Cuidado! Parâmetros: char* filename: nome do arquivo a ser escrito. WavHeader* header: ponteiro para os dados do cabeçalho. double* data_l: dados do canal esquerdo. double* data_r: dados do canal direito. Ignorado se o arquivo for mono. Valor de Retorno: 1 se não ocorreram erros, 0 do contrário.

WavHeader generateSignal (int* n_samples, unsigned short num_channels, unsigned long sample_rate, double** data_l, double** data_r); Gera um sinal de conteúdo indeterminado. Use esta função se, em vez de ler os dados de um arquivo, você quiser gerar um sinal. Parâmetros: int* n_samples: ponteiro para uma variável contendo o número de amostras a gerar para cada canal. Se for maior que o permitido, a função gera um sinal menor que o pedido e modifica o valor da variável. unsigned short num_channels: número de canais a gerar. Precisa ser 1 ou 2, qualquer outro valor é automaticamente tratado como 1. unsigned long sample_rate: taxa de amostragem. Se for == 0, é automaticamente ajustada para 44.1kHz. double** data_l: parâmetro de saída, é um ponteiro para um vetor dinâmico, onde manteremos os dados para o canal esquerdo. O vetor será alocado nesta função, lembre-se de desalocá-lo quando ele não for mais necessário! double** data_r: igual ao anterior, mas para o canal direito. Se num_channels == 1, o vetor será == NULL. Valor de Retorno: o cabeçalho para o sinal gerado.

void generateRandomData (double* data, int n_samples); Preenche um vetor dado com dados aleatórios (ruído). A função NÃO inicia a semente aleatória. Parâmetros: double* data: vetor a preencher. int n_samples: número de amostras no vetor. Valor de Retorno: NENHUM

int writeSamplesAsText (char* filename, double* data, unsigned long n_samples); Salva as amostras em um arquivo de texto, uma amostra por linha. Esta função é útil para visualizar os dados e depurar o trabalho. Parâmetros: char* filename: nome do arquivo a ser escrito. double* data: vetor de dados contendo as amostras. unsigned long n_samples: número de amostras no vetor. Valor de Retorno: 1 se não ocorreram erros, 0 do contrário.

Clone this wiki locally