580 likes | 696 Views
Conceitos de Sinais e Sistemas Mestrado em Ciências da Fala e da Audição. António Teixeira. Som em Matlab Aliasing Quantização SNR Conversão D/A Operações com sinais. Aula 4. Som em Matlab. Ver Matlab num Instante. Sumário. Geração de som com o Matlab
E N D
Conceitos de Sinais e SistemasMestrado em Ciências da Fala e da Audição António Teixeira
Som em Matlab Aliasing Quantização SNR Conversão D/A Operações com sinais Aula 4
Som em Matlab Ver Matlab num Instante
Sumário • Geração de som com o Matlab • Funções do Matlab para manipular sons • sound • wavread • wavwrite • Geração de sons artificais • ruído • sinusóides • soma de duas sinusóides • sinusóides de frequência variável
Som no Matlab • É possível utilizar o Matlab na manipulação e geração de som. • Existem funções para ler ficheiros de som para um vector, gravar um vector para um ficheiro e para reproduzir sons a partir de ficheiros. • Podem-se ouvir os vectores!
Função sound A função sound permite reproduzir um som armazenado num vector. Sintaxe sound(x,fa) em que x é um vector linha ou coluna e fa é a frequência de amostragem que se pretende utilizar.
Função wavread A função wavread lê um ficheiro de som em formato “wav” do Windows. Sintaxe [x,fa]= wavread(’ficheiro’) em que x é um vector , fa é a frequência de amostragem utilizada e ‘ficheiro’ é o ficheiro de som que se pretende ler.
Função wavwrite A função wavwrite escreve um ficheiro de som em formato “wav” do Windows. Sintaxe wavwrite(x,fa,’ficheiro’) em que x é um vector , fa é a frequência de amostragem utilizada e ‘ficheiro’ é o ficheiro de som onde se pretende guardar o som armazenado em x.
Exemplo: ficheiro de som Neste exemplo pretende-se ler para um vector um som armazenado num ficheiro e reproduzi-lo no Matlab [x,fa]= wavread('som.wav'); sound(x,fa)
Exemplo: Gravar um som • Neste exemplo lê-se para um vector armazenado num ficheiro, manipula-se e grava-se num ficheiro diferente. [x,fa]= wavread('som.wav'); sound(x,fa) y= x(end:-1:1); % Inverte no tempo wavwrite(y,fa,'som2.wav');
Alteração da freq. de amostragem Ao reproduzir um som é possível alterar a frequência de amostragem com que é reproduzido. Exemplo: utilizando o dobro da frequência de amostragem do original. sound(x,fa*2) Exemplo: utilizando metade da frequência de amostragem do original sound(x,fa/2)
Geração de sons artificiais O Matlab possui formas expeditas de gerar sons artificais. Vamos ver como é que se geram diferentes tipos de sons. A função rand gera uma sequência pseudo aleatória. Qual será o som produzido por um vector gerado com este função? x= rand(1,10000)-0.5; % Ruído de média nula sound(x,8000);
Geração de sons artificiais A função seno desempenha um papel central na geração de sons articiais. Vejamos qual o som que obtemos. fa= 8000; Ta= 1/fa; t= 0:Ta:1; %Gera o sinal de tempo x= sin(2*pi*400*t); % sinusóide de 400Hz sound(x,fa);
Geração de sons artificiais Soma de duas sinusóides Podemos gerar dois vectores com sinusóides com frequências diferentes e somá-los para ouvir o resultado fa= 8000; Ta= 1/fa; t= 0:Ta:1; %Gera o sinal de tempo x= sin(2*pi*400*t); % sinusóide de 400Hz y= sin(2*pi*410*t); % sinusóide de 410Hz soundsc(x+y,fa);
Geração de sons artificiais Multiplicação de sinusóides Podemos gerar dois vectores com sinusóides de frequências diferentes e realizar um produto ponto-a-ponto entre eles. fa= 8000; Ta= 1/fa; t= 0:Ta:1; %Gera o sinal de tempo x= sin(2*pi*400*t); % sinusóide de 400Hz y= sin(2*pi*80*t); % sinusóide de 80Hz soundsc(x.*y,fa);
Geração de sons artificiais Sinusóides de frequência variável Com o Matlab não é muito díficil gerar uma sinusóide cuja frequência varia linearmente ao longo do tempo. fa= 8000; Ta= 1/fa; t= [0:Ta:2 2:-Ta:0]; %Gera o tempo x= sin(2*pi*400*t.*t); sound(x,fa)
Geração de sons artificiais Sinusóides de frequência variável Neste exemplo temos uma sinusóide cuja frequência varia ao longo do tempo de forma sinusóidal. fa= 8000; Ta= 1/fa; t= 0:Ta:2; %Gera o sinal de tempo s= 80*sin(2*pi*5*t); x= sin(2*pi*400*t + s); sound(x,fa)
Demos e links • Demonstração de um efeito áudio de modificação do sinal de voz • Ficheiro Matlab • Som original • Som modificado • Links para páginas interessantes sobre som • Página sobre o som e a sua digitalização • Página sobre a audição • CoolEdit96 - demo de um programa de edição de som mas que permite ouvir, visualizar e manipular sons digitais
O que acontece se não se amostra suficientemente rápido? x(t)=A cos (2f0t+) se amostramos com um período Ts obtemos x[n]=x(nTs)=A cos (2f0nTs+) Consideremos outra sinusóide com frequência f0+k fs, com k inteiro e fs=1/Ts y(t)=A cos (2(f0+k fs)t + ) Amostrando y(t) com o mesmo Ts, obtemos y[n]=y(nTs) =A cos (2 (f0+k fs) nTs+) = A cos (2f0 nTs+ 2 k fs Ts+) = A cos (2f0 nTs+ 2 k +) = A cos (2f0 nTs +) = x[n] y[n] tem as mesmas amostras que x[n] sendo impossível distingui-la de x[n]. Como k é um inteiro, positivo ou negativo, existem um número infinito de sinusóides que resultam nas mesmas amostras x[n] quando amostradas com a frequência fs !
alias • As frequências f0+k fs são chamadas “alias” da frequência f0 • porque todas elas parecem ser a mesma quando amostradas com frequência de amostragem fs • No dicionário Inglês-Português da Porto Editora: • alias [´eiliaes] , 1 adv. aliás 2 s. pseudónimo, nome falso, nome suposto
Uma segunda fonte de “aliasing” - “folding” x(t)=A cos (2f0t+) se amostramos com um período Ts obtemos x[n]=x(nTs)=A cos (2f0nTs+) Consideremos outra sinusóide com frequência -f0+k fs, com k inteiro e fs=1/Ts w(t)=A cos (2(-f0+k fs)t + ) Amostrando y(t) com o mesmo Ts, obtemos w[n]=y(nTs) =A cos (2 (-f0+k fs) nTs+) = A cos (-2f0 nTs+ 2 k fs Ts+) = A cos (-2f0 nTs+ 2 k +) = A cos (2f0 nTs +) % porque cos(- )=cos() = x[n] w[n] tem as mesmas amostras que x[n] sendo impossível distingui-la de x[n].
Porquê “folding” freq. aparente 1000 1000 2000 Frequência real
Aliasing • Sendo f a frequência de um sinal e a frequência de amostragemfs, as seguintes regras permitem calcular a frequência • f < ½fs • Como a frequência do sinal se encontra abaixo do limite imposto pelo teorema da amostragem, não ocorre “aliasing”; o sinal amostrado possui a frequência correcta. • ½fs < f < fs • Existe “aliasing” sendo a frequência do sinal amostradofa = fs - f • f > fs • Ocorre “aliasing”. Para obter a frequência do sinal amostrado obter o resto da divisão de fporf. No final se ½fs < f < fs o sinal amostradofa = fs - f; caso contrário fa = f
Quantização • Os valores contínuos da amplitude também têm de ser convertidos em valores tratáveis pelo computador • Os computadores guardam os números usando 0s e 1s, os chamados bits • Este processo designa-se por quantização
Capacidade de representação • 1 Bit = 2 estados • 2 Bits = 4 estados • 3 Bits = 8 estados • ... • N Bits = 2N estados Memória : : 8 Bits 256 palavras : :
Capacidade de representação • Exemplo do número de estados possíveis possíveis para 3 bits
Precisão, número de bits • O número de bits usados para representação determina a precisão (ou resolução) em amplitude do processo de amostragem referido atrás. • Quanto mais bits forem usados, maior será essa resolução. • Para obtermos uma resolução equivalente à de um sistema CD de áudio, são necessários 16 bits, • o que significa que temos 65536 combinações numéricas possíveis. • Os valores de amplitude amostrados são sempre arredondados para o código binário mais próximo.
Exemplo de quantização • 8 bits • 7 bits • 3 bits • 2 bits
Número de bits • 8 bits • 256 níveis • Se tivermos sinal entre – 1 e + 1 V • Erro máximo 3.4 mV (mili=0.001) • 16 bits • 65536 níveis • Se tivermos sinal igual ao anterior • Erro máximo 15 microV (micro=0.000001)
Exemplo 3 bits
Em Matlab t=0:1e-3:4 x= sin (2*pi*10*t)+1 % para ser entre 0 e 1 bits=8 N=2^bits xquant=round(x*(N-1)/2)*2/(N-1) stem(t,xquant,'ro'); hold on; diferenca=x-xquant plot(t,diferenca, 'g+') % experimente com bits=1,2 ...
Resultados 4 bits 2 bits erro 8 bits
Erro de arredondamento e bits 1 N=níveis = distância entre níveis -1 N=2/ N =2 =N/2 Erro máximo de arredondamento é = /2=1/N logo N=1/ número de bits (b) b log2 N
SNR devido a quantização SNR= 20 log10 (App/) como A=2 e N=2b temos = 2-b App/= 2 x 2b = 2b+1 20 log10 (2b+1) = 20 (b+1) log10 (2) 6 (b+1) dB aumento de 6 dB/bit
Exercício • Estimar o número de bits necessários para representar amostras de um sinal com valores entre –1 e 1 com um erro de arredondamento inferior a 10-3
Em Matlab % RETOMANDO O EXEMPLO ANTERIOR t=0:1e-3:4; x= sin (2*pi*10*t); bits=8; N=2^bits; xquant=round(x*(N-1)/2)*2/(N-1); plot(t,xquant,'ro'); hold on; diferenca=x-xquant; plot(t,diferenca, 'g+'); % valor do erro máximo de arredondamento neste caso concreto max(diferenca) % valor teórico para o erro máximo de arredondamento 1/N % SNR snr=10*log10(dot(x,x)/dot(diferenca,diferenca)) % EXPERIMENTE com 1,2 ... até 8 bits. Qual o aumento de snr com o aumento de 1 bit ?
Demo1 – reconstrução com impulsos quadrados – “hold” • Demo2 – com impulsos triangulares • Demo2 – com impulsos ideais truncados
Operações com sinais I • Operações na variável dependente • Mudança de escala (da amplitude) • y(t)=c x(t) ou y[n]=c x[n] • Exemplo: Amplificador electrónico • Adição • y(t)= x1(t) + x2(t) • Exemplo: mixer áudio • Multiplicação • y(t)= x1(t) x2(t) • Exemplo: sinal de rádio AM (modulação de Amplitude) • Diferenciação, Integração • Ex: bobine e condensador
x(2t) x(t) t x(t/2) t t Operações na variável independente • Mudança da escala temporal • y(t)= x (a t) a>1 => compressão 0<a<1 => expansão Alguma ideia de aplicação na área da fala?
x(t) -t1 t t2 y(t)=x(-t) t -t2 t1 Operações na variável independente • inversão temporal y(t)= x (- t)
TPC • Leitura dos 2 capítulos relativos a sinais do livro Rosen & Howell
Codificação/Representação Os vários tipos de informação são codificados de forma diferente. Para interpretar cada um dos formatos é necessário um descodificador.
Código ASCII (texto) • A primeira versão do código ASCII (American Standard Code for Information Interchange) foi criada em 1963 para normalizar a transmissão e armazenamento de texto. Em 1967 foram incluídas as letras minúsculas no código que no essencial permaneceu inalterado até aos nossos dias.
Código ASCII Exemplo de codificação para a letra “A” 4x16+1=64+1=65=100 0001 Letra “W”: 5x16+7=87=101 0111
0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 Exemplo código ASCII • Código ASCII • 7 Bits = 128 Caracteres Memória : : 0 77 65 84 MATLAB 76 65 66 : :