Você está na página 1de 113

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

ESCOLA POLITÉCNICA
DEPARTAMENTO DE ELETRÔNICA E DE COMPUTAÇÃO

Analisador Senoidal de Sinais Musicais

Autor:
Leonardo de Oliveira Nunes

Orientador: Prof. Luiz Wagner Pereira Biscainho

Banca Examinadora:

Orientador:
Prof. Luiz Wagner Pereira Biscainho

Examinador:
Prof. Eduardo Antonio Barros da Silva

Examinador:
Prof. Sergio Lima Netto

Examinador:
Paulo Antonio Andrade Esquef, PhD

DEL
Setembro de 2007
Agradecimentos

Este projeto foi desenvolvido ao longo de mais de dois anos de iniciação cientı́fica no
Laboratório de Processamento de Sinais da Poli & COPPE, UFRJ. Durante esses mais de
dois anos, diversas pessoas influenciaram diretamente ou indiretamente este trabalho, fosse
através de idéias, apoio “moral” ou crı́ticas. Acredito não existir agradecimento suficiente
para estas pessoas, mas, mesmo assim, tentarei agradecer-lhes nesta seção.
Antes de tudo, devo agradecer a minha famı́lia (e nisto incluo todos os meus amigos)
pelo apoio dado durante todos esses anos de educação e, acima de tudo, pelo amor. Meus
pais, minha irmã e meus avós criaram o ambiente no qual este trabalho se tornou realidade.
Tenho que agradecer a uma pessoa muito especial que surgiu este ano e sem a qual este
trabalho não teria sido tão agradável, a minha namorada, Maria Lucia.
Ao Prof. Luiz Wagner devo agradecer por ter acreditado em mim e ter me aceitado
como aluno de inciação cientı́fica, pela infinita paciência e, acima de tudo, pela amizade.
Não posso deixar de lado todos os amigos que fiz no Grupo de Processamento de Áudio e
cujos trabalhos estão de alguma forma associados a este. Agradeço a Fábio Freeland, Iúri
Kothe, Filipe Diniz, Alan Tygel, Rafael de Jesus, Alexandre Leizor, Flávio Ávila, Michel
Tcheou e a todos os outros membros GPA. Um agradecimento especial deve ser dado ao
Paulo Esquef, por trazer o tema deste trabalho para o GPA e pelas inúmeras sugestões e
idéias, além de ter aceitado participar da banca deste trabalho. Agradeço, também, aos
amigos do LPS, especialmente Tadeu Ferreira e André Targino. E a Wallace Martins, pela
amizade e inúmeras discussões técnicas.
Por fim, agradeço a todos os amigos da minha turma de faculdade. Eles tornaram as
dificuldades encontradas ao longo do curso mais toleráveis e agradáveis. Também agradeço
ao corpo docente do Dep. de Engenharia Eletrônica e de Computação, especialmente aos
Profs. Eduardo Barros e Sérgio Lima Netto por terem aceitado o convite para participar da
banca. Também agradeço ao CNPq pela bolsa que recebi durante a execução deste trabalho.

ii
Resumo

Técnicas de análise de áudio estão presentes em um sem-número de aplicações, como


mixagem e edição, transcrição musical automática, composição e execução musical, sı́ntese
sonora de instrumentos, identificação de instrumentos, temas e estilos, representação com-
pacta etc.
Em particular, técnicas baseadas em modelos são interessantes por permitirem con-
centrar a informação extraı́da do sinal em poucas componentes, mais representativas. Assim,
a modelagem pode resultar numa representação intermediária do sinal musical: mais inter-
pretável que a variação de uma grandeza elétrica ao longo do tempo, e menos simbólica que
uma partitura musical.
Considerando a natureza “tonal” (espectro com predominância de picos) dos sinais
musicais, um dos modelos mais favoráveis à sua representação é o senoidal, que descreve
o sinal como um somatório de senóides cujas amplitude e fase (freqüência) são moduladas
ao longo do tempo. Sob a hipótese de que a amplitude e a freqüência das componentes do
sinal são estacionárias para trechos curtos de tempo, é possı́vel estimar os parâmetros deste
modelo utilizando-se técnicas de processamento de sinais.
Este trabalho consiste no desenvolvimento de um programa para Matlab para a ob-
tenção do modelo senoidal de sinais de áudio. O sistema desenvolvido é flexı́vel, permitindo a
utilização de diversas técnicas para a obtenção do modelo, e modular, permitindo que novas
técnicas sejam adicionadas no futuro. A interface com o usuário é feita através de linha de
comando ou de uma interface gráfica.

iii
Palavras-Chave

processamento digital de sinais


análise de sinais de áudio
análise tempo-freqüência
análise espectral
modelo senoidal

iv
Sumário

Agradecimentos ii

Resumo iii

Palavras-Chave iv

Sumário v

1 Introdução 1
1.1 O Modelo Senoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Sistemas de Análise Senoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Estrutura do Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Descrição Teórica 7
2.1 Visão Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Decomposição Tempo-Freqüência . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1 Transformada de Fourier de Curta Duração . . . . . . . . . . . . . . 9
2.3 Técnicas de Estimação de Freqüência Instantânea . . . . . . . . . . . . . . . 13
2.3.1 Visão Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2 Reatribuição da Freqüência . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.3 DFT1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.4 Método da Diferença de Fases . . . . . . . . . . . . . . . . . . . . . . 18
2.3.5 Método da Diferença de Fases Iterativo . . . . . . . . . . . . . . . . . 18
2.4 Técnicas de Estimação da Amplitude e Fase . . . . . . . . . . . . . . . . . . 19
2.5 Técnicas de Estimação de Atraso de Grupo . . . . . . . . . . . . . . . . . . . 22
2.6 Algoritmos para Detecção de Picos Espectrais . . . . . . . . . . . . . . . . . 24
2.6.1 Estratégia de Detecção dos Picos . . . . . . . . . . . . . . . . . . . . 25

v
2.6.2 Pré-Processamento Espectral . . . . . . . . . . . . . . . . . . . . . . 26
2.6.3 Correção do Espectro . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6.4 Critérios de Seleção de Picos . . . . . . . . . . . . . . . . . . . . . . . 30
2.7 Métodos de Ligação dos Picos Espectrais . . . . . . . . . . . . . . . . . . . . 33
2.7.1 Visão Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.7.2 Algoritmo de McAulay & Quatieri . . . . . . . . . . . . . . . . . . . 35
2.7.3 Predição pelo Algoritmo de Burg . . . . . . . . . . . . . . . . . . . . 39
2.7.4 Predição por Filtragem Adaptativa . . . . . . . . . . . . . . . . . . . 41
2.7.5 Comentário sobre os algoritmos de ligação das trilhas . . . . . . . . . 44
2.8 Sı́ntese das Trilhas Senoidais . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3 Descrição do Programa 47
3.1 Visão Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2 Módulo Básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.1 Parâmetros de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2.2 Estrutura das Pastas . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.3 Formato de um Método . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.2.4 A Função sn_analysis . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2.5 Manipulação de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3 Interface no Modo Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.4 Interface Gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5 A Função sinus() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.6 Métodos Implementados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.6.1 Métodos de Mapeamento Tempo-Freqüência . . . . . . . . . . . . . . 63
3.6.2 Métodos de Pré-processamento Espectral . . . . . . . . . . . . . . . . 64
3.6.3 Métodos de Busca dos Picos Espectrais . . . . . . . . . . . . . . . . . 65
3.6.4 Métodos de Refinamentos . . . . . . . . . . . . . . . . . . . . . . . . 66
3.6.5 Métodos de Rastreamento das Parciais . . . . . . . . . . . . . . . . . 67

4 Exemplos 70
4.1 Sinal Modulado em Amplitude e Freqüência . . . . . . . . . . . . . . . . . . 70
4.1.1 Configuração “Clássica” . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.1.2 Configuração com Refinamentos . . . . . . . . . . . . . . . . . . . . . 72

vi
4.2 Sinais Reais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

5 Conclusões 79

A Requisitos 81
A.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
A.1.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
A.1.2 Escopo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
A.1.3 Definições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
A.1.4 Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.2 Descrição Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.2.1 Perspectiva do Produto . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.2.2 Funções do Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
A.2.3 Caracterı́sticas do Usuário . . . . . . . . . . . . . . . . . . . . . . . . 88
A.3 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
A.3.1 Requisitos Funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
A.3.2 Requisistos Não-funcionais . . . . . . . . . . . . . . . . . . . . . . . . 90

B Sinus User Guide 91


B.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
B.2 System Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
B.3 Installing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
B.4 The Parameters Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
B.4.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
B.4.2 Obtaining a Method Structure . . . . . . . . . . . . . . . . . . . . . . 94
B.4.3 Saving and Loading Parameters . . . . . . . . . . . . . . . . . . . . . 95
B.5 The sinus() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
B.6 Saving, Loading, Plotting, and Synthesizing . . . . . . . . . . . . . . . . . . 96
B.6.1 Saving and Loading Tracks . . . . . . . . . . . . . . . . . . . . . . . . 96
B.6.2 Plotting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
B.6.3 Synthesizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
B.7 The Graphical User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Referências Bibliográficas 99

vii
Capı́tulo 1

Introdução

O rápido desenvolvimento dos processadores digitais aliado aos avanços das técnicas
de processamento de sinais permitiu a aplicação de técnicas cada vez mais sofisticadas para
a análise, modificação e extração de informações de diferentes tipos de sinais. Análise e
modificação de sinais de áudio, em particular, se beneficiaram desse constante incremento
computacional. Dentre os principais desenvolvimentos em processamento de sinais de áudio,
podemos destacar as seguintes aplicações:

• Transcrição Musical Automática [1] – consiste em obter uma partitura musical (ou
uma forma equivalente) a partir de um sinal musical. Usualmente, sistemas de trans-
crição automática são formados por subsistemas responsáveis pelo reconhecimento do
andamento, identificação de instrumentos musicais e identificação das notas musicais.

• Codificação de Áudio [2]– resumidamente, consiste em reduzir o número de bits neces-


sários para a representação do sinal causando o mı́nimo de perda de qualidade para o
ouvinte.

• Restauração de Sinais [3] – sinais musicais podem ser degradados de diversas maneiras,
seja por defeitos inseridos pelos mecanismos de gravação, seja pelos meios de armazena-
mento. Algoritmos de restauração de áudio buscam identificar e remover a degradação
causando o mı́nimo de distorção ao potencial sinal não degradado.

• Separação de Fontes Sonoras [4] – consiste em identificar e separar sinais de áudio


que foram somados (acústica ou eletricamente) anteriormente, sem o conhecimento de
nenhum dos sinais pertencentes à mistura. Um caso particular é a separação de sinais
provenientes de diferentes instrumentos musicais.
Todas essas aplicações podem usufruir de uma representação do sinal que concentre
a informação relevante do sinal em um número reduzido de componentes. Se essa for uma
representação intermediária [5] entre o sinal de áudio no tempo e sua representação numa
forma simbólica (por exemplo, uma partitura), será vantajosa por estar mais próxima das
informações de interesse para os algoritmos da aplicação. Além disso, possui um número
reduzido de parâmetros que, preferencialmente, são associáveis a aspectos fı́sicos/musicais
do sinal original.
Com isso, um modelo adequado para uma representação intermediária e um sistema
para obtê-lo são muito desejáveis. Este projeto consiste na elaboração de um sistema para
a obtenção do modelo senoidal, uma representação intermediária para sinais de áudio e voz.
Esse modelo vem sendo utilizado para diversas aplicações em processamento digital de sinais
de áudio e será apresentado na próxima seção.

1.1 O Modelo Senoidal


O modelo senoidal [6] proposto em [7] para sinais de voz e adaptado para sinais musi-
cais em [8] consiste em modelar o sinal de áudio como um somatório de senóides moduladas
em freqüência (fase) e amplitude. O modelo, na sua versão em tempo contı́nuo t, pode ser
escrito como:
L
X
x(t) = Al (t) sen(Φl (t)),
l=1 (1.1)
Z t
Φl (t) = Φl (0) + ωl (u)du,
0

onde x(t) é o sinal a ser modelado, L é o número de componentes senoidais presentes no sinal
(também chamdas de parciais) e Al (t), ωl (t) e Φl (0) são os parâmetros a serem obtidos para
cada termo do somatório: a modulação em amplitude, a modulação em freqüência e a fase
inicial, respectivamente.
Este modelo utiliza a caracterı́stica ressonante dos sinais de áudio, que se reflete num
espectro com predominância de picos, para concentrar a informação do sinal em um número
reduzido de parâmetros. Vale lembrar que a certos sinais musicais pode-se atribuir um pitch 1
que pode vir a ser traduzido convencionalmente numa nota musical. Uma interpretação dos
1
Pitch pode ser definido como a freqüência percebida por um ouvinte.

2
parâmetros obtidos pelo modelo senoidal para um sinal gerado por um único instrumento
executando apenas uma nota seria:

• ωl (t) – modelariam as freqüências de cada uma das parciais l, incluindo suas variações
no tempo, como por exemplo as produzidas por um vibrato;

• Al (t) – modelariam o timbre do instrumento, já que ponderariam diferentemente cada


harmônico; além disso, conteriam a informação da envoltória de cada harmônico do
sinal. Este parâmetro informa sobre o instante em que a nota musical começa a e
termina de ser executada.

As considerações acima podem ser facilmente estendidas para um sinal gerado por mais de
um instrumento executando mais de uma nota musical.
O modelo apresentado em (1.1) é de difı́cil obtenção e intratável computacionalmente
devido à sua natureza contı́nua. Para facilitar a análise, o modelo em tempo contı́nuo (1.1)
é substituı́do pela sua versão discreta:
L
X
x[n] = Al [n] sen Φl [n]. (1.2)
l=1

Esse novo modelo, para fins de análise, pode ser considerado estacionário para tempos curtos.
Isso corresponde a dizer que, para uma dada parcial l, e considerando que Al [n] e Φl [n]
possuem largura de banda [9] muito menor do que a do sinal sob análise, as aproximações
Al [n] ≈ Al e Φl [n] ≈ Ωl n + Φl [0], onde Al e Ωl são constantes, são válidas para um intervalo
no tempo de N amostras. Essas hipóteses sobre o sinal nos levam a um sistema de análise
por blocos, que permite explorar essa estacionariedade para curtas durações do sinal, e que
será apresentado no próximo capı́tulo.
Historicamente, o primeiro sistema de análise senoidal foi o Phase Vocoder [10], ainda
sobre um modelo em tempo contı́nuo, apesar de não assumir explicitamente o modelo se-
noidal. O modelo se popularizou com o método de análise introduzido em [7] e em [8] para
sinais discretos, que resumidamente consiste em buscar os picos dos espectros obtidos para
trechos (quadros) de curta duração do sinal e ligar os picos de quadros adjacentes ao longo
do tempo, formando as chamadas trilhas senoidais. As trilhas senoidais seriam a represen-
tação computacional do modelo senoidal obtido para um determinado sinal. Esse método
será o objeto deste trabalho, e é comumente chamado de modelo senoidal por rastreamento
de parciais. A modelagem senoidal apresenta sobre outros métodos [11–13] as vantagens de

3
modularidade e robustez; cada uma de suas etapas dispõe de uma variedade de métodos na
literatura.
Algumas soluções para se obter o modelo senoidal procuram evitar a etapa de detecção
de picos. Dentre os principais métodos alternativos de análise, os principais são a análise
por sı́ntese [14], a utilização de matching pursuit [13, 15] e a utilização de processamento
bayesiano [16].
O modelo senoidal clássico considera apenas a parte tonal de um sinal. Para contor-
nar essa limitação, algumas extensões ao modelo original foram propostas. Esses modelos
expandidos procuram aumentar o número de sinais que podem ser modelados. A primeira
extensão proposta [8] modela a parte não-tonal como a realização de um processo estocás-
tico, que é somada ao modelo senoidal original. O processo estocástico é obtido através da
conformação espectral do ruı́do por um filtro variante do tempo, determinado a partir do
resı́duo do sinal original após a subtração de sua parcela descrita pelo modelo senoidal. Esse
modelo é chamado de modelo senoidal+ruı́do e foi adotado pelo MPEG, grupo responsável
pela padronização de codificadores de áudio e vı́deo, na formulação de um codificador a ta-
xas muito baixas para sinais de áudio [17]. Outra possı́vel extensão leva em consideração as
partes transitórias do sinal de áudio (normalmente associadas a instrumentos percussivos ou
que concentram a energia emitida em curtos intervalos no tempo). Usualmente, o resı́duo da
subtração do sinal original pelo sinal obtido através do modelo senoidal+ruı́do é modelado
no domı́nio do tempo, levando a uma representação só para os transitórios [18], formando
assim um modelo senoidal+transitórios+ruı́do. A Figura 1.1 ilustra a obtenção dos modelos
estendidos. O trabalho atual considera apenas o modelo senoidal puro, que serve de base
para a obtenção dos modelos estendidos.

1.2 Sistemas de Análise Senoidal


O modelo senoidal obtido utilizando-se o método clássico permite um alto grau de
modularidade2 . Os sistemas atuais de análise senoidal, no entanto, não aproveitam essa
modularidade, abrindo mão da escolha entre os algoritmos propostos na literatura. Isso
dificulta a implementação de novos métodos dentro destes sistemas.
2
Modularidade aqui está sendo usada no sentido de independêndia entre os “blocos” que compõem um
sistema, ou seja, ao desacoplamento entre as etapas do processamento.

4
Sinal Modelo Senóides
Original Senoidal

Modelo Transitórios
Transitório
Sinal
Sintetizado

Modelo Ruı́do
Ruı́do

Figura 1.1: Diagrama ilustrando a obtenção do modelo senoidal+transitório+ruı́do. Este


diagrama foi adaptado do trabalho [18].

A seguir, alguns sistemas de análise senoidal serão apresentados, destacando-se resu-


midamente as suas principais caracterı́sticas.

• PARSHL [8] – foi um dos primeiros programas para análise senoidal de áudio; ele utiliza
o modelo senoidal clássico, adicionado de uma interpolação parabólica para refinar a
localização dos picos espectrais. Ele permite a escolha de alguns parâmetros, mas não
permite a escolha dos métodos utilizados em cada etapa do processamento.

• Clam [19, 20] – é uma plataforma completa de processamento de sinais de áudio que
inclui um pacote de análise senoidal. O pacote, chamado SMSTools [21, 22], utiliza um
modelo de senóides+ruı́do e considera o sinal de entrada como harmônico.

• SMSPerformer [23] – utiliza o modelo clássico e se concentra nas modificações das trilhas
obtidas. Seu foco principal está na sı́ntese das trilhas em tempo real, permitindo que
modificações sobre as trilhas obtidas sejam controladas pelo usuário ao longo da sı́ntese.

• Loris [24, 25] – utiliza o modelo senoidal com banda alargada [26], e foi um dos pri-
meiros a utilizar a reatribuição de tempo e freqüência para a análise. O seu foco é na
transformação e sı́ntese das trilhas obtidas.

Como pode ser observado, os programas possuem como foco a manipulação e sı́ntese das
trilhas. Eles não exploram a modularidade dos métodos de análise senoidal, já que os algo-
ritmos utilizados para se obter os modelos não podem ser escolhidos. Ademais, a ênfase de
todos esses programas está na manipulação e utilização de determinados modelos, e não em
obtê-los.

5
Seria desejável, para fins acadêmicos, um programa que explorasse a grande variedade
de métodos de análise senoidal. Essa plataforma, idealmente, deveria permitir que diferentes
algoritmos para análise senoidal pudessem ser comparados em um mesmo ambiente. Além
disso, os diversos parâmetros dos métodos deveriam estar disponı́veis para o usuário, per-
mitindo que este controlasse a especificação do sistema. Com isso, o comportamento dos
métodos para diferentes sinais e a interação de diferentes métodos para diferentes parâme-
tros poderiam ser observados.
Este é o objetivo deste projeto: criar um sistema de análise senoidal que permita ao
usuário escolher um dentre diversos métodos em cada etapa da análise senoidal, bem como os
parâmetros dos métodos escolhidos. O sistema deverá facilitar a criação de novos métodos,
permitindo que novas idéias sejam rapidamente comparadas aos métodos já existentes. A
c
plataforma escolhida para a implementação foi o Matlab , devido a sua facilidade de pro-
gramação e ao seu amplo uso dentro da comunidade cientı́fica. Escolheu-se uma interface
com o usuário no modo texto, que permite o fácil acoplamento do sistema de análise senoidal
com sistemas que possam vir a utilizar as trilhas obtidas, além de uma interface gráfica que
permite uma rápida configuração e execução do sistema pelo usuário.

1.3 Estrutura do Texto


Após esta breve introdução, a análise senoidal por rastreamento de parciais será de-
talhada no Capı́tulo 2. Neste capı́tulo o algoritmo original de análise senoidal será descrito
juntamente com diversas alternativas encontradas na literatura.
No Capı́tulo 3 são apresentados o sistema desenvolvido e a implementação dos métodos
discutidos no capı́tulo anterior. É descrita a solução de modularização e são detalhadas as
facilidades para os usuários e futuros desenvolvedores de métodos para o sistema. A interface
gráfica e a interface de modo texto também são apresentadas ao final do capı́tulo.
O Capı́tulo 4 dá exemplos da utilização do sistema para a obtenção das trilhas senoi-
dais e para testes de diferentes métodos. Para isso, são utilizadas diferentes configurações
do sistema, demonstrando sua versatilidade, e são exibidas as trilhas obtidas para diferentes
sinais de teste.
Por fim, o Capı́tulo 5 apresenta as conclusões obtidas do projeto e propõe trabalhos
futuros.

6
Capı́tulo 2

Descrição Teórica

Neste capı́tulo é apresentado o sistema senoidal por rastreamento de trilhas. Primei-


ramente, dá-se uma visão geral do algoritmo, mostrando todas as etapas necessárias para a
obtenção do modelo senoidal. Em seguida, são descritas soluções para cada etapa.

2.1 Visão Geral


O algoritmo básico de análise senoidal pode ser dividido em três etapas seqüenciais:

1. Decomposição Tempo-Freqüência

Sinais de áudio possuem um espectro variante no tempo, o que leva à necessidade de


ferramentas matemáticas que capturem adequadamente essa variação. Para fins da
análise senoidal, é necessário obter parâmetros variantes no tempo, como a amplitude
e a freqüência das componentes senoidais, que são facilmente observáveis no espectro
do sinal. Logo, a primeira etapa de busca dos componentes senoidais consiste no
mapeamento de um sinal variante no tempo em um sinal variante no tempo e na
freqüência [9]; esse mapeamento não é único [27] para um dado sinal, e impõe distorções
ao espectro observado. A solução adotada para este trabalho e alguns melhoramentos
sobre esta solução serão apresentados na Seção 2.2.

2. Busca dos Picos Espectrais

Uma vez obtido o espectro do sinal para cada instante de tempo de análise, é neces-
sário identificar os elementos do espectro originados pelas componentes senoidais. A
representação espectral para uma senóide com duração infinita no tempo e amplitude e
freqüência constantes são dois impulsos, localizados na freqüência da senóide e sua si-
métrica, com área total proporcional à amplitude da senóide. Logo, é de se esperar que
as componentes senoidais, caso o mapeamento tempo-freqüência seja feito adequada-
mente, provoquem picos (embora não mais impulsos) espectrais em posições próximas
da sua freqüência para aquele instante de tempo e amplitude próxima da amplitude
da componente nesse instante. No entanto, nem todo pico espectral observado será
provocado pelas componentes espectrais, já que ocorrências espúrias devido a ruı́do
e distorções provocadas pela própria decomposição tempo-freqüência do sinal podem
estar presentes no espectro. Faz-se necessária, então, uma estratégia para selecionar os
picos provocados pelas componentes senoidais. Esta estratégia é descrita na Seção 2.6.

3. Rastreamento das Parciais

Até esse ponto, apenas a informação da localização das componentes senoidais na


forma de pontos no plano tempo-freqüência é conhecida. Ainda é necessário fazer al-
guma associação entre os pontos ao longo do tempo, identificando, assim, cada termo
do somatório da equação (1.1). Dessa maneira, ao se ligar os pontos no plano tempo-
freqüência, obtém-se para cada componente senoidal o comportamento da amplitude e
da freqüência ao longo do tempo. O algoritmo de ligação dos picos espectrais deve ser
robusto o suficiente para lidar com picos espúrios introduzidos por erros nas etapas an-
teriores e ainda saber lidar com casos de difı́cil análise, como o cruzamento de parciais.
Soluções para esse problema são apresentadas na Seção 2.7.

pm Rastreamento
x[n] Decomposição S[m, k] Busca dos Trilhas
Tempo−Freqüência Picos Espectrais das
Parciais Senodais

Figura 2.1: Etapas para a obtenção do modelo senoidal de um sinal x[n].

A Figura 2.1 ilustra as três etapas da obtenção do modelo senoidal para um sinal
discreto x[n]. A saı́da da decomposição tempo-freqüência é a matriz S[m,k] correspondente
ao espectro do sinal x[n] para cada instante de tempo de análise m e freqüência de análise k. A
‘Busca dos Picos Espectrais’ é realizada sobre essa matriz, e fornece as posições pm dos picos
espectrais para cada instante de análise m. A informação da localização dos picos é utilizada
pelo algoritmo de ‘Rastreamento das Parciais’ juntamente com a informação espectral desses
picos para obter as trilhas senoidais.

8
As trilhas senoidais são a representação computacional das componentes senoidais.
Elas são caracterizadas como vetores, um para cada componente senoidal identificada, con-
tendo a informação de amplitude e freqüência para cada instante de tempo de análise; para
melhorar a qualidade da sı́ntese, também pode ser armazenada a fase em cada instante de
tempo de análise.

2.2 Decomposição Tempo-Freqüência


O primeiro passo para a obtenção do modelo senoidal é a decomposição tempo-
freqüência. Esta etapa consiste em obter uma segmentação adequada do plano tempo-
freqüência [9, 27, 28]. Esta partição deve ser tal que cada componente senoidal do sinal seja
observável. O princı́pio de incerteza de Gabor-Heisenberg [9] diz que um sinal não pode ser
limitado arbitrariamente no tempo e na freqüência simultaneamente, logo faz-se necessário
algum compromisso entre a resolução do tempo e a resolução da freqüência da decomposição
escolhida.
A decomposição escolhida para este trabalho foi a transformada de Fourier de curta
duração, STFT (do inglês, Short-Time Fourier Transform), popular por seu baixo custo
computacional. Essa popularidade acabou por provocar o aparecimento, na literatura, de
diversas propostas para contornar suas limitações. A STFT discreta, seus parâmetros e
algumas questões de implementação são discutidos abaixo.

2.2.1 Transformada de Fourier de Curta Duração

A transformada de Fourier de curta duração consiste em segmentar o sinal em blocos


no tempo (chamados quadros) e obter a transformada de Fourier para cada um desses blo-
cos. A divisão (ideal) no plano tempo-freqüência obtida pela STFT pode ser observada na
Figura 2.2.
A STFT, na sua versão discreta, pode ser definida como:
N −1
1 X 2π
S[m,k] = STFT{s[n]} = w[n]s[n + mH]e−jk N n , (2.1)
N n=0

onde N é o comprimento da transformada discreta de Fourier [29] ou DFT (do inglês, Discrete
Fourier Transform), utilizada para calcular o espectro do sinal no instante m, H é o salto, em
amostras, entre janelas consecutivas e w[n] é uma janela de suavização [30] tal que w[n] = 0

9
Freqüência

Tempo

Figura 2.2: Segmentação do plano tempo-freqüência para a STFT.

para |n| > K. A Figura 2.3 ilustra o efeito da segmentação do sinal pela janela, ressaltando
H e N. O fator de superposição entre janelas adjacentes pode ser escrito como
K −H
Q= . (2.2)
K
A escolha dos parâmetros K, H, N e o formato da janela de suavização definem o tipo
de segmentação obtido do plano tempo-freqüência, definindo as resoluções no tempo e na
freqüência. A influência destes parâmetros na segmentação do plano tempo-freqüência e o
relacionamento entre os parâmetros serão discutidos a seguir.

Sinal
K H Janela

m−2 m−1 m m+1 m+2

Figura 2.3: Ilustração do janelamento no tempo de um sinal.

O comprimento da janela no tempo, K, é o fator mais importante para a troca de


resolução no tempo pela resolução na freqüência. Quanto maior o comprimento da janela,
maior a resolução na freqüência, e vice-versa. Esse efeito pode ser visto na Figura 2.4, onde,
para diferentes tamanhos de janela, o espectro da janela é exibido. A distorção causada no
espectro do sinal pelo seu janelamento é o efeito da convolução do espectro da janela com

10
o espectro do sinal. Obviamente, a menor distorção possı́vel ocorreria quando o espectro da
janela fosse um impulso, ou seja, não ocorresse janelamento. Isso apenas mostra que alguma
distorção espectral sempre ocorrerá ao se fazer o janelamento. Já a resolução no tempo piora
conforme o comprimento da janela cresce; isso se deve ao fato de que qualquer variação que
ocorra no sinal dentro de uma mesma janela será analisada da mesma maneira. Um ataque
de um instrumento musical, por exemplo, teria sua energia espalhada dentro da janela, se o
comprimento da janela fosse maior que a duração do evento no tempo.

1 0

| W | (dB)
K = 512
w

0,5 −50

0 −100
−1000 −500 0 500 1000 −0,05 0 0,05
1 0
K = 1024
| W | (dB)
w

0,5 −50

0 −100
−1000 −500 0 500 1000 −0,05 0 0,05
K = 2048 1 0
| W | (dB)
w

0,5 −50

0 −100
−1000 −500 0 500 1000 −0,05 0 0,05
n (amostras) Ω (π rad)

Figura 2.4: Janela de suavização no tempo w[n] e seu espectro W (ejΩ ) para diferentes valores
de K. Pode-se notar o efeito do aumento da resolução na freqüência em detrimento da
resolução no tempo.

O salto H determina quais pontos no tempo serão analisados, e por conseguinte o


número de pontos que serão analisados. A escolha do salto vai definir a “taxa de amostragem”
dos parâmetros Al [n] e ωl [n]; logo, caso a variação esperada dessas funções seja alta um salto
pequeno deve ser usado. Um salto igual a 1 implicaria o maior número possı́vel de pontos;
a complexidade computacional, no entanto, cresce com o número de pontos de análise, e
isso inviabiliza o uso de um H muito baixo. Superiormente, H costuma ser limitado pelo
comprimento da janela de análise. Usualmente, H é definido através do fator de superposição
Q, que indica quantas vezes cada amostra da janela de análise, e conseqüentemente do sinal,
será utilizada. Um fator de superposição de 50%, por exemplo, indica que cada amostra será
utilizada duas vezes.
São encontradas na literatura soluções de segmentação do sinal dependentes de algum

11
parâmetro do sinal. Para sinais muito tonais ou para sinais de voz, uma possı́vel solução
seria utilizar janelas contendo um número inteiro de perı́odos da freqüência fundamental do
sinal [7]. Outra solução utiliza um algoritmo para detectar os transitórios e comprimir ou
expandir o comprimento das janelas de modo que as janelas sempre se iniciem logo após um
transitório e terminem logo antes do próximo [31]. Há ainda uma solução de segmentação
adaptativa por otimização [32]. Essas soluções podem ser utilizadas em conjunto com a
solução adotada neste trabalho, porém não foram implementadas.
Para algumas aplicações que utilizam superposição e soma [33] para retornar o sinal
para o domı́nio do tempo, é necessário que as janelas de análise, quando deslocadas de um
fator H, se somem numa constante. Caso isto não ocorra, o sinal sofrerá uma distorção na
sua ampltitude ao retornar para o domı́nio do tempo. Esta distorção na amplitude do sinal
causada pelo janelamento é função do formato da janela e do fator de superposição, e pode
ser escrita como:
K
X
DA [n] = w[n − Hm], (2.3)
m=o

e deve ser feita constante. A janela de Hann, por exemplo, é uma janela que soma 1 com
fator de superposição de 50% e soma 2 com fator de superposição de 75%. O caso da janela
de Hann com 50% de superposição pode ser visto na Figura 2.5.

1
w

0,5

0
0 500 1000 1500 2000 2500 3000
n

Figura 2.5: Janelas de Hann somando a unidade quando Q = 0,5. As linhas cheias são as
janelas e a linha tracejada é a soma.

O último parâmetro da STFT a ser discutido é o comprimento da DFT, N. Caso N


seja menor que K, nem toda a informação do sinal é utilizada ao se calcular o espectro; por
isso, escolhe-se N ≥ K. Usualmente N = K, e o espectro obtido contém toda a informação
presente no sinal. Para N > K, o sinal janelado é preenchido com N − K zeros, um procedi-

12
mento conhecido como zero-padding [34,35]. Este procedimento não aumenta a resolução na
freqüência, que é definida pela janela de suavização e seu comprimento, mas apenas facilita
a visualização e o processamento do espectro. Outra vantagem do zero-padding é a possi-
bilidade de forçar que N seja uma potência de 2, levando a uma economia computacional
no cálculo do espectro. Deve-se lembrar que, eventualmente, conforme N cresce, o espectro
obtido com a DFT converge para o espectro contı́nuo do sinal discreto, a menos de uma
constante de normalização. Além de aumentar o número de operações aritméticas requeridas
pelos métodos que processam o espectro, a elevação de N pode, eventualmente, ressaltar
aspectos do espectro que podem dificultar a sua análise, como os lobos laterais da janela. A
Figura 2.6 demonstra o efeito de zero-padding para um sinal composto de duas senóides: o
espectro obtido para três valores de N com a DFT (bolas) e o espectro contı́nuo do sinal dis-
creto (linha tracejada) podem ser observados. Pode-se notar que para N = K a localização
dos máximos é pouco definida; já para N = 2K, a localização dos máximos é mais definida,
mas os lobos laterais das janelas se tornam proeminentes; com N = 4K, a localização dos
máximos é pouco alterada, mas os lobos laterais se tornam ainda mais proeminentes.
Atribuindo-se o ponto de análise no tempo ao centro da janela de suavização e con-
siderando que N > K, a fase da janela obtida não será zero. Este simples procedimento
corrige este efeito indesejável:

1. Inicialize o buffer da DFT com N zeros;

K−1
2. Preencha o final do buffer com as 2
primeiras amostras do sinal janelado;

3. Armazene as amostras restantes do sinal janelado no inı́cio do buffer.

Este procedimento é chamado de janelamento de fase zero [8]. A Figura 2.7 demonstra o
procedimento de janelamento com fase zero.

2.3 Técnicas de Estimação de Freqüência Instantânea


A localização da freqüência das componentes senoidais extraı́das utilizando a STFT
está limitada aos valores escolhidos pela DFT. Esses valores, por sua vez, são linearmente

espaçados de N
radianos. Este espaçamento fixo pode ser interpretado como uma indesejável
quantização dos valores assumidos pelo parâmetro Ωl [n].

13
N = 1024
Magnitude (dB)

−25

−50
1500 2000 2500 3000 3500
N = 2048
Magnitude (dB)

−25

−50
1500 2000 2500 3000 3500
N = 4096
Magnitude (dB)

−25

−50
1500 2000 2500 3000 3500
Freqüência (Hz)

Figura 2.6: Efeito do zero-padding para um sinal composto de duas senóides de freqüência
2 kHz e 3 kHz com amplitude unitária, janelados por uma janela de Hann com K = 1024.
Esta figura foi adaptada de [6].

Sinal Original
1
Amplitude

−1
0 50 100 150 200 250 300 350 400 450 500
Sinal Janelado
1
Amplitude

−1
0 50 100 150 200 250 300 350 400 450 500
1
Amplitude

0
zero padding
−1
0 100 200 300 400 500 600 700 800 900 1000
Tempo (amostras)

Figura 2.7: Ilustração do algoritmo de janelamento de fase zero para K = 513 e N = 1024.

14
Esta seção apresenta métodos para melhorar a localização obtida utilizando uma DFT,
permitindo que Ωl assuma quaisquer valores. Estes métodos, utilizando o modelo adotado,
procuram encontrar a freqüência que melhor descreve a região do espectro supostamente
associada a uma dada componente senoidal. Tal freqüência pode ser obtida por uma estima-
tiva da freqüência instantânea em um quadro de análise para uma determinada componente
senoidal.

2.3.1 Visão Geral

O objetivo dos estimadores apresentados a seguir é encontrar “pontos” na freqüência


que melhor representem o sinal, principalmente se a freqüência variar no tempo. Intuitiva-
mente, pode-se imaginar que os métodos de estimação de freqüência instantânea procuram
encontrar o ponto na freqüência que melhor representa a distribuição de energia do sinal, em
vez de usar o centro geométrico. Por exemplo, no caso de uma DFT os centros geométri-
cos seriam os pontos centrais de cada raia da DFT, enquanto que os métodos de estimação
de freqüência instantânea poderiam encontrar um ponto intermediário para representar a
distribuição de energia.
A formulação dos métodos apresentados a seguir utiliza a STFT em tempo contı́nuo,
que pode ser definida como:

Z ∞
S(t,ω) = s(τ )w(τ − t)e−jω(τ −t) dτ = A(ω,t)ejΦ(t,ω) , (2.4)
−∞
onde S(ω,t) é o espectro obtido, w(t) é a versão em tempo contı́nuo da janela de suavização
e s(t) é o sinal a ser modelado. A freqüência instantânea da STFT pode ser definida como:

∂Φ(t,ω)
ω̂(t,ω) = . (2.5)
∂t
A formulação matemática para os estimadores de freqüência instantânea apresentados
a seguir se baseia nos artigos [36, 37]. Os estimadores apresentados são baseados na fase do
sinal, ou seja, todos tentam estimar a freqüência instantânea através da estimação da derivada
da fase do espectro, mostrada na equação (2.5). Avaliações desses estimadores podem ser
encontradas em [38] e em [39].
Outras famı́lias de estimadores de freqüência instantânea incluem os estimadores que
utilizam aproximações polinomiais [40] e estimadores paramétricos como o ESPRIT [41].
Do ponto de vista de complexidade computacional e precisão, os estimadores baseados na

15
expressão (2.5) se situam entre os estimadores paramétricos (mais precisos, porém mais com-
plexos) e os polinomiais (menos precisos, porém menos complexos). Sua vantagem sobre os
estimadores paramétricos é não requererem o conhecimento do número de senóides presentes
no sinal.

2.3.2 Reatribuição da Freqüência

O primeiro estimador estudado é a reatribuição da freqüência. A idéia é reatribuir


os pontos da freqüência para os centros de gravidade do espectro do sinal. Sua primeira
formulação foi realizada para bancos de filtros em [42], e sua generalização para diversas
distribuições tempo-freqüência foi feita em [43, 44]. A derivação do estimador segue como:

∂ ℑ{log(S(t,ω))}
 
∂ Φ(t,ω) 1 ∂S(t,ω)
ω̂r = = =ℑ . (2.6)
∂t ∂t S(t,ω) ∂t
Onde ℑ(·) denota a parte imaginária. Substituindo a expressão analı́tica para a STFT
contı́nua (2.11) na expressão acima:

( R∞ )
1 ∂ −∞ s(τ )w(τ − t)e−jω(τ −t) dτ
ω̂r (t,ω) = ℑ
S(t,ω) ∂t
Z ∞
∂w(τ − t)e−jω(τ −t)
 
1
=ℑ s(τ ) dτ
S(t,ω) −∞ ∂t
 Z ∞ 
1 −jωτ ′ jωt jωt
=ℑ s(τ )e [−w (τ − t)e + jωw(τ − t)e ]dτ
S(t,ω) −∞ (2.7)
 Z ∞ 
1 ′ −jω(t−τ ) −jω(τ −t)
=ℑ [−s(τ )w (τ − t)e + jωs(τ )w(τ − t)e ]dτ
S(t,ω) −∞

−Sw′ (t,ω) + jωS(t,ω)

=ℑ
S(t,ω)
  
Sw′ (t,ω)
= ℑ{jω} − ℑ
S(t,ω)
Com isso, a estimativa se torna:
 
Sw′ (t,ω)
ω̂r (t,ω) = ω − ℑ , (2.8)
S(t,ω)

onde Sw′ (t,ω) é a STFT do sinal janelado pela derivada w ′ (t) da janela w(t). A versão
discreta dessa estimativa pode ser obtida através de:

 
2πk Sw′ [m,k]
Ω̂r [m,k] = −ℑ . (2.9)
N S[m,k]

16
Neste caso, Sw′ [k,m] é o espectro discreto obtido utilizando-se a derivada da janela. A
derivada da janela pode ser aproximada de maneira computacionalmente eficiente a partir
da multiplicação do espectro da janela por uma rampa na freqüência [45]. A janela w ′ [n]
passa a ser:

 
′ k
w [n] = IDFT DFT{w[n]} . (2.10)
Fs
Outros métodos podem ser utilizados para se obter a derivada da janela, sendo este, no
entanto, o mais encontrado na literatura.

2.3.3 DFT1

O segundo método de estimação de freqüência instantânea é a DFT1 [46, 47]. Este


método utiliza o fato de a derivada da função seno (ou cosseno) ser proporcional à sua
freqüência. Duas formulações para a DFT1 são possı́veis: a primeira é a formulação clássica,
onde o estimador é obtido derivando-se a equação (1.1), que representa o modelo senoidal
no tempo contı́nuo, e a segunda segue a formulação apresentada para a reatribuição da
freqüência. A segunda formulação será apresentada, uma vez que ressalta a ligação deste
método com o método apresentado anteriormente.
A formulação a seguir considera a seguinte mudança de variável para a STFT contı́nua:
ρ = τ − t. A expressão para a STFT com essa mudança de variável fica:

Z ∞
S(t,ω) = s(ρ + t)w(ρ)e−jωρ dρ. (2.11)
−∞

Substituı́ndo a expressão acima em (2.6), obtêm-se:


( R∞ −jωρ
)
1 ∂ −∞ s(ρ − t)w(ρ)e dρ
ω̂d (t,ω) = ℑ
S(t,ω) ∂t
 Z ∞ 
1 −jω(τ −t) ∂s(ρ + t)
=ℑ w(ρ)e dρ
S(t,ω) −∞ ∂t (2.12)
 Z ∞ 
1 ′ −jω(τ −t)
=ℑ w(ρ)s (ρ + t)e dρ
S(t,ω) −∞
 ′ 
S (t,ω)
=ℑ
S(t,ω)

O estimador DFT1 para o tempo contı́nuo é, então:


 ′ 
S (t,ω)
ω̂d (t,ω) = ℑ , (2.13)
S(t,ω)

17
onde S ′ (t,ω) é a STFT da derivada do sinal.
Para se obter a versão discreta da DFT1 é necessário aproximar a derivada do sinal;
para isso uma aproximação de primeira ordem pode ser utilizada:

s′ [n] = (s[n] − s[n − 1])Fs . (2.14)

Esta aproximação, na realidade, é um filtro passa-altas com ganho igual a 2Fs sen(πΩ). Uma
vez que se espera que o ganho da derivada seja linear na freqüência, a devida correção deve
ser feita na aproximação da derivada do sinal. O operador discretizado incluindo a correção
pode ser escrito como:  ′ 
1 S [m,k]
Ω̂d [m,k] = arcsen
, (2.15)
π 2Fs S[m,k]
onde S ′ [m,k] é o espectro obtido do sinal s′ [n]:

S ′ [m,k] = STFT{s′ [n]}. (2.16)

2.3.4 Método da Diferença de Fases

Este método, diferentemente dos estimadores anteriores, procura estimar a freqüência


aproximando a derivada da fase já no domı́nio discreto. Uma possı́vel aproximação seria:

 
1 1 S[m,k]
Ω̂f [m,k] = (∠S[m,k] − ∠Sd [m,k]) = ∠ , (2.17)
d d Sd [m,k]
onde Sd [m,k] é o espectro obtido deslocando-se o sinal de d amostras:

Sd [m,k] = STFT{s[n − d]}. (2.18)

Deve-se tomar o cuidado de “desdobrar” a fase da janela para que a diferença nunca
fique negativa. Esse estimador tem uma longa história, sendo sua primeira formulação feita
para o tempo contı́nuo no Phase Vocoder [10]. Valores pequenos para d fornecem melho-
res estimativas, sendo que para d = 1 não é necessário “desdobrar” a fase (considerando
a freqüência das componentes constante neste intervalo) [48], evitando, assim, mais uma
aproximação para o estimador.

2.3.5 Método da Diferença de Fases Iterativo

Os estimadores de freqüência anteriores necessitam de uma estimativa prévia da


freqüência, que, no caso discreto, pode ser tomado como a freqüência associada a uma raia da

18
DFT. O método iterativo [49] considera este cálculo como uma primeira aproximação para
a freqüência instantânea e busca refinar essa primeira aproximação.
No caso do método da diferença de fases, a formulação pode ser feita substituindo-se
a DFT (freqüência discreta) pela DTFT (freqüência contı́nua) no cálculo da STFT discreta.
Com isso podemos escrever:

N −1
1 X
S(m,Ω) = w[n]s[n + mH]e−jΩn . (2.19)
N n=0
O algoritmo é executado para todos os m quadros do sinal. Para facilitar a notação, o ı́ndice
do quadro será omitido. O algoritmo pode ser escrito como:

 
1 S(θi−1 )
θi = ∠ , (2.20)
d Sd (θi−1 )
onde i é a iteração atual, θi são as freqüências estimadas na iteração i e:

θ0 = Ω̂f [m,k]. (2.21)

Com isso, para cada passo do algoritmo novas estimativas para as freqüências são encon-
tradas. A DTFT é avaliada apenas nos pontos obtidos no passo anterior, evitando assim
aproximações numéricas desnecessárias. O critério de parada pode ser escolhido com base
na diferença de estimativas consecutivas: se essa diferença estiver abaixo de um limiar, o
algoritmo pára.
Uma maneira mais eficiente de se escolher a condição inicial é inicializar o algoritmo
apenas com os pontos correspondentes aos picos espectrais, diminuindo sua complexidade
computacional.
Outra possı́vel melhoria sobre o algoritmo seria corrigir a amplitude e a fase do sinal
utilizando os métodos de estimação desses parâmetros apresentados na próxima seção. Neste
caso, o algoritmo possuiria dois passos: no primeiro, a freqüência seria estimada; em seguida,
de posse dos novos valores para a freqüência, a amplitude seria recalculada, e o algoritmo
seria iterado. A idéia de estimar a amplitude ajuda a minimizar os efeitos da janela, deixando
o desempenho do algoritmo mais independente da escolha da janela.

2.4 Técnicas de Estimação da Amplitude e Fase


De posse de uma estimativa da freqüência instantânea, um primeiro refinamento na
amplitude e na fase pode ser a projeção do sinal janelado em uma exponencial com freqüência

19
igual à freqüência instantânea estimada. Desta maneira, os valores da amplitude e da fase,
que antes foram calculados pela freqüência obtida com a DFT, agora são obtidos para o valor
refinado da freqüência. Primeiramente será definido o sinal janelado para o quadro m, que
é:
sw [n,m] = s[n − m]w[n]. (2.22)

Com isso, a estimativa de amplitude pode ser escrita como:


N −1
1 X
Ŝs [m,Ω̂] = √ sw [n,m]e−j Ω̂n . (2.23)
N n=0
PN −1
Foi considerado nesta expressão que a janela de suavização obedece n=0 w[n] = 1 (w[n] ≥ 0,
PN −1
∀n), caso isso não seja verdade, deve-se dividir o resultado pelo valor n=0 w[n]. A estimação
da amplitude pode ser realizada apenas para os valores de Ω̂ que possuem um pico espectral
associado a ele no quadro m, reduzindo o número de operações.
Um outro estimador possı́vel considera o vazamento de energia de duas componen-
tes próximas no espectro [34]. Primeiramente, considerando o espectro com apenas duas
exponenciais complexas com amplitude e freqüências fixas (no quadro m) tem-se:

sw [n,m] = w[n] A1 ej(Ω1 n+Φ1 ) + A2 ej(Ω2 n+Φ1 ) .



(2.24)

O espectro deste sinal será:

S(Ω,m) = W (Ω) ∗ [A1 ejΦ1 δ(Ω − Ω1 ) + A2 ejΦ2 δ(Ω − Ω2 )], (2.25)

onde ∗ denota convolução, W (Ω) é o espectro da janela de suavização e δ(Ω) é o impulso


unitário. Usando a propriedade da amostragem do impulso unitário:

S(Ω,m) = A1 ejΦ1 W (Ω − Ω1 ) + A2 ejΦ2 W (Ω − Ω2 ). (2.26)

Nas freqüências Ω1 e Ω2 temos:

S(Ω1 ,m) = A1 ejΦ1 W (0) + A2 ejΦ2 W (Ω1 − Ω2 ), (2.27)

S(Ω2 ,m) = A1 ejΦ1 W (Ω2 − Ω1 ) + A2 ejΦ2 W (0). (2.28)

Com isso A1 e A2 podem ser encontrados através do seguinte sistema de equações:


    
S(Ω1 ,m) W (0) W (Ω1 − Ω2 ) A1 ejΦ1
 =  . (2.29)
jΦ2
S(Ω2 ,m) W (Ω2 − Ω1 ) W (0) A2 e

20
Este procedimento pode ser generalizado para um número qualquer de exponenciais. Con-
siderando E exponenciais complexas presentes no quadro sob análise, pode-se escrever o
seguinte sistema de equações:
    
jΦ1
S(Ω1 ,m) W (0) W (Ω1 − Ω2 ) · · · W (Ω1 − ΩE ) A e
    1 
 S(Ω2 ,m)   W (Ω2 − Ω1 ) W (0) · · · W (Ω2 − ΩE )   A2 ejΦ2
    

=  , (2.30)
.. .. .. .. .. ..
 
. . . . . .
    
    
    
S(ΩE ,m) W (ΩE − Ω1 ) W (ΩE − Ω2 ) ··· W (0) AE ejΦE
ou, equivalentemente:
SΩ,m = WŜΩ,m . (2.31)

Com isso,
ŜΩ,m = W−1 SΩ,m , (2.32)

onde
W[i,j] = W (Ωi − Ωj ). (2.33)

Considerando o sinal de entrada como um somatório de exponenciais complexas com


fase e amplitude constantes em cada quadro m, os valores de amplitude e fase podem ser
obtidos através da equação (2.32), dada a freqüência de cada exponencial. Deve-se notar que
para este caso ideal a estimativa é exata se a freqüência de cada componente for conhecida.
O espectro de um sinal, no entanto, dificilmente será composto apenas de exponenciais
e/ou as freqüências das exponenciais estarão disponı́veis. No caso real, haverá uma parcela
não exponencial somada ao sinal ideal e apenas estimativas das freqüências estarão disponı́-
veis. Além disso, a matriz W pode ficar mal-condicionada caso seja avaliada em freqüências
que não estejam associadas a uma exponencial. Para melhorar o desempenho do estima-
dor ele deve ser utilizado após a etapa de detecção dos picos espectrais, onde (idealmente)
apenas a amplitude e freqüência associadas a picos espectrais serão estimadas. Outro fator
importante para a melhoria do desempenho deste estimador é a utilização das freqüências
instantâneas estimadas anteriormente.
Computacionalmente este método é bastante custoso, sendo necessário realizar uma
inversão matricial e, caso as estimativas de freqüência instantânea sejam utilizadas, também
calcular a matriz W através de diversas DTFTs. Uma maneira de diminuir o número de
operações é considerar que apenas as exponenciais próximas à freqüência da exponencial de
interesse distorcem a fase e a amplitude. Esta hipótese é razoável se o espectro da janela
decair rapidamente conforme ele se afasta da origem.

21
2.5 Técnicas de Estimação de Atraso de Grupo
Assim como a freqüência, os instantes de análise no tempo dos parâmetros do modelo
senoidal podem ser vistos como quantizados devido ao salto realizado no tempo. Desta ma-
neira, o instante utilizado para representar o que acontece dentro de um quadro é, a princı́pio,
o centro da janela. Este instante pode nem sempre ser o mais adequado para representar
o comportamento das diversas componentes dentro de um mesmo quadro. Intuitivamente,
pode-se pensar que este instante seria ideal caso a distribuição de energia fosse simétrica em
torno do centro da janela (como em uma senóide com amplitude constante). Para compo-
nentes que podem variar a sua amplitude dentro de uma mesma janela de análise (o que
pode acontecer durante o onset de uma nota musical, por exemplo) este ponto deixa de ser
o mais adequado.
Uma solução para encontrar o ponto que melhor descreve cada componente é a rea-
tribuição do tempo [44], onde a idéia é análoga à utilizada na reatribuição da freqüência.
Os pontos que melhor representariam cada componente seriam os centros de energia do sinal,
ao contrário dos centros geométricos. A fase do espectro será novamente utilizada, mas agora
será feita a derivada da fase em relação a freqüência, isto é, o atraso de grupo. Com isso
pode-se escrever o tempo corrigido como:

∂Φ(t,ω)
t̂(t,ω) = t − . (2.34)
∂ω
Neste caso pode-se dizer que o tempo que melhor descreve cada componente do espectro é
dad pelo centro da janela corrigido pelo atraso de grupo dessa componente. Substituindo-se
a expressão para a fase da STFT contı́nua, encontra-se:

22
( R∞ )
∂Φ(t,ω) 1 ∂ −∞ s(τ )w(τ − t)e−jω(τ −t) dτ
=ℑ
∂ω S(t,ω) ∂ω
Z ∞
∂e−jω(τ −t)
 
1
=ℑ s(τ )w(τ − t) dτ
S(t,ω) −∞ ∂t
 Z ∞ 
1 −jω(t−τ )
=ℑ −js(τ )(t − τ )w(τ − t)e dτ
S(t,ω) −∞ (2.35)
 Z ∞ 
1 −jω(t−τ )
=ℜ s(τ )(t − τ )w(τ − t)e dτ
S(t,ω) −∞
 Z ∞ 
1 −jω(t−τ )
=ℜ s(τ )wt (τ − t)e dτ
S(t,ω) −∞
 
St (t,ω)
=ℜ ,
S(t,ω)

onde o espectro St (t,ω) é obtido utilizando-se um janela de suavização multiplicada por uma
rampa no tempo, ou seja:
wt (t) = tw(t). (2.36)

Combinando-se a expressão (2.34) com a expressão (2.35) chega-se a:


 
St (t,ω)
t̂(ω,t) = t − ℜ . (2.37)
S(t,ω)

A expressão acima é facilmente discretizada, levando à expressão:


 
mH St [m,k]
t̂[m,k] = −ℜ , (2.38)
Fs S[m,k]

onde o espectro discreto St [k,m] pode ser obtido utilizando-se a janela de suavização discreta
multiplicada por uma rampa:
n
wt [n] = w[n]. (2.39)
Fs
Uma vez obtidas as estimativas t̂[m,k], estes pontos podem ser utilizados durante a
análise como mais um parâmetro das componentes senoidais. Quando utilizadas para sı́ntese,
as estimativas t̂ melhoram a representação senoidal, pricipalmente nos ataques, ajudando na
detecção de onsets [50] e permitindo a modelagem de instrumentos percussivos [45].
Em [26], um procedimento chamado de time crop utiliza essas estimativas para retirar
picos possivelmente associados a ruı́do ou a componentes que serão mal modeladas num
quadro de análise. O procedimento
 retira, antes da etapa de ligação das trilhas, os parâmetros
St [k,m]
para os quais o valor ℜ é maior que um determinado limiar escolhido. A idéia
S[m,k]
por trás desta heurı́stica é que, se os pontos são reatribuı́dos para instantes de tempos muito

23
distantes do centro do quadro de análise, um outro quadro melhor capturará essa componente.
Este procedimento, além de retirar pontos provocados por ruı́dos, reduz o efeito de pré-eco
na etapa de sı́ntese. Similarmente, em [51] a reatribuição do tempo é utilizada para a
classificação de picos espectrais.

2.6 Algoritmos para Detecção de Picos Espectrais


Uma vez disponı́vel o espectro S[m,k] (com ou sem os refinamentos descritos anteri-
ormente), a próxima etapa para se obter o modelo senoidal é encontrar os picos espectrais
que supostamente correspondem às componentes senoidais.
A etapa de detecção dos picos espectrais consiste na detecção e classificação dos picos
presentes no espectro. A detecção consiste em encontrar os picos espectrais, usualmente
através de uma simples busca. Os picos encontrados, por sua vez, podem ser classificados
de duas maneiras: picos genuı́nos ou picos espúrios. Os picos genuı́nos estão associados a
uma componente senoidal presente no sinal original. Os picos espúrios, ao contrário, estão
associados a uma parcela de ruı́do presente no sinal. Um bom detector, então, pode ser
definido como um que detecta e classifica corretamente todos os picos genuı́nos presentes no
espectro (não há perda de picos) e, ao mesmo tempo, rejeita todos os picos espúrios (não há
falsos alarmes).
Os algoritmos descritos a seguir utilizam apenas a informação presente num quadro
para essa deteção. Por este motivo e para aliviar a notação utilizada, o sub-ı́ndice relativo ao
quadro será omitido na discussão a seguir. Além disso, nesta seção, S[k] será utilizado para
denotar o espectro em magnitude de um quadro do sinal. Deve-se lembrar que as etapas da
detecção de picos devem ser realizadas para todos os quadros do sinal.
O método utilizado neste trabalho é baseado em seleção de picos espectrais através
de um limiar de energia. Para isto, a estratégia de seleção de picos adotada se divide em
dois blocos: o pré-processamento espectral e a seleção dos picos, como pode ser visto na
Figura 2.8. Ambas as partes serão descritas nas seções seguintes. Este texo é baseado na
descrição realizada em [52].

24
S S′ Seleção dos P
Picos

Pré-processamento E
Espectral

Figura 2.8: Diagrama de blocos ilustrando a estratégia de detecção de picos espectrais.

2.6.1 Estratégia de Detecção dos Picos

Em esquemas de detecção de picos, o critério mais simples é escolher os picos espectrais


que ultrapassem um determinado limiar pré-definido de energia. Embora simples, esse critério
não é adequado quando utilizado para sinais de áudio, que, comumente, possuem um espectro
em que a energia decresce com a freqüência [53]. Devido a isso, muitos picos genuı́nos são
descartados nas freqüências altas. Este efeito pode ser visto na Figura 2.9, onde um limiar
adequado para baixas freqüências se mostra inadequado para altas freqüências.

0
−10 S[k]
Limiar
Magnitude (dB)

−20
−30
−40
−50
−60
−70
0 5 10 15 20
Freqüência (kHz)

Figura 2.9: Efeito do limiar aplicado ao espectro de um sinal de áudio sem pré-processamento.

O bloco de pré-processamento espectral tenta superar essa limitação compensando o


desbalanceamento espectral. Simplificadamente, o pré-processamento espectral busca corrigir
esse desbalanceamento espectral através de uma estimativa da conformação espectral do ruı́do
aditivo. Alternativamente, pode-se tentar estimar o desbalanceamento dos picos através de
uma estimativa da envoltória espectral da parte determinı́stica do sinal.

25
2.6.2 Pré-Processamento Espectral

As sessões a seguir descrevem quatro métodos propostos na literatura para estimar ou


o colorimento do ruı́do de fundo ou a envoltória espectral. Para ambos os casos a estimativa
será denominada E[k].

Modelagem AR de Baixa Ordem

Modelos autoregressivos (AR) são amplamente utilizados em processamento de sinais


de áudio como, por exemplo, modelagem do trato vocal em processamento de fala [54].
Neste algoritmo, o modelo AR do sinal janelado nos fornece uma estimativa da en-
voltória do espectro do sinal. O procedimento consiste em ajustar um modelo AR de baixa
ordem ao sinal no domı́nio do tempo sw [n]. A envoltória desejada E ar [k] é a magnitude do
espectro do modelo AR de baixa ordem para sw [n].
Em termos matemáticos, podemos assumir que o sinal xw [n] seja representado pelo
seguinte modelo AR:
q
X
sw [n] = a[u]sw [n − u] + r[n], (2.40)
u=1

onde q é a ordem (insuficiente) do modelo, a[u] são os coeficientes do modelo e r[n] é o erro
de modelagem.
Os parâmetros do modelo podem ser estimados através de qualquer estimador AR
padrão [55], como os métodos de Burg e Yule-Walker. Uma vez obtido o modelo A(z) =
−1
[1 − qu=1 au z −u ] , a envoltória espectral pode ser obtida através de E ar [k] = |A(ejωk )|,
P

2πk
onde ωk = N
.

Two-Pass Split Window

A filtragem TPSW (do inglês, Two-Pass Split Window ) foi originalmente proposta
para estimação espectral de ruı́do em sistemas de sonar [56]. O procedimento pode ser
decomposto em três etapas. Na primeira etapa o espectro S[k] é filtrado por uma split
window descrita por [56]:

0, |k| < M sw

hsw [k] = (2.41)
1, M sw ≤ |k| < N sw ,

com 0 ≤ M sw < N sw , sendo N sw e M sw inteiros positivos que controlam, respectivamente, o


comprimento da split window e a quantidade de zeros em seu interior.

26
A saı́da da primeira etapa S̃[k] é, então, modificada de acordo com o seguinte critério:

S[k], if S[k] ≤ αS̃[k]

Ŝ[k] = (2.42)
S̃[k], if S[k] > αS̃[k],

onde α ≥ 1 é um parâmetro relacionado com a rejeição de picos no espectro observado.


No último estágio, o espectro modificado Ŝ[k], que supostamente está livre dos picos
mais proeminentes do espectro S[k], é filtrado por um filtro de média móvel convencional,
com o mesmo comprimento da split window. A saı́da desta terceira etapa corresponde à
estimativa desejada, E tpsw [k]. Os filtros FIRs utilizados no primeiro e terceiro estágio devem
ser normalizados de modo a possuir ganho unitário em DC.
Na filtragem TPSW, considera-se que S[k] está contido entre 0 e π. De modo a evitar
efeitos de bordas durante as filtragens, o espectro deve ser estendido em aproximadamente
20%. Para isto, parte do espectro em ambas as extremidades é espelhada. Os atrasos
causados pela filtragem são compensados de modo a garantir o sincronismo entre a entrada
e a saı́da. Isto pode ser feito tomando-se apenas a parte central da correlação dos resultados
da filtragem. Ao final, as extensões são descartadas de modo a retornar o espectro ao seu
tamanho original.
Em relação aos parâmetros para a split window, a suavidade da estimativa E tpsw [k]
estará associada diretamente ao comprimento da janela N sw . O parâmetro M sw deve ser
escolhido de modo que o número de zeros na janela corresponda à largura de banda dos
picos mais proeminentes. O valor de α está relacionado a capacidade de rejeição de picos do
algoritmo. Ele deve ser pequeno o suficiente para garantir que a componente αS̃[k] esteja
abaixo da amplitude média dos picos e grande o suficiente para que αS̃[k] fique acima do
nı́vel do ruı́do. Usualmente, são obtidos resultados satistatórios para 2 ≤ α ≤ 8.

Estimação do Espectro Estocástico

O estimador do espectro estocástico (SSE) é outro estimador não-linear para o colo-


rimento do espectro do ruı́do. O método foi apresentado em [57, 58].
O método SSE consiste dos quatro passos a seguir:

1. Passar S[k] por um filtro média-móvel de três coeficientes, de modo a obter S 1 [k]
possivelmente livre de valores nulos;

1
2. Computar R[k] = S 1 [k]
;

27
3. Obter R1 [k], uma versão suavizada de R[k], através da convolução cı́clica entre R[k] e
um filtro de média móvel FIR com N sse coeficientes;

1
4. Calcular a estimativa desejada: E sse [k] = R1 [k]
.

Assim como o método TPSW, a suavidade de E sse [k] aumenta conforme o valor de
N sse . Além disto, todos os filtros FIR devem ser normalizados para ganho DC unitário.
Diferentemente dos esquemas anteriores, no método SSE S[k] deve ser considerado dentro do
intervalo de −π a π, para poder se utilizar da convolução cı́clica. O intervalo de 0 a π pode
ser adotado, mas a convolução cı́clica precisa ser substituı́da por uma filtragem convencional,
e o mesmo esquema de extensão nas bordas utilizado pelo método TPSW deve ser adotado.

Filtro Recursivo Não-Linear

Em [59] um filtro recursivo não-linear (NRSF) é proposto para estimar o espectro de


ruı́do colorido de fundo na presença de picos espectrais. O filtro, desenvolvido sob a hipótese
de que a densidade espectral de poténcia do ruı́do varia lentamente com a freqüência, limita
em módulo a primeira derivada (slew rate) das amostras do espectro em função da freqüência.
O filtro recursivo não-linear que implementa esta solução é dado por:

E nrsf [k] = E nrsf [k − 1]β sinal(S[k]−E ),


nrsf [k−1]
(2.43)

onde E nrsf [k] é a estimativa desejada, β é uma constante pouco maior que a unidade e:

1, se x ≥ 0

sinal(x) = . (2.44)
−1, se x < 0

O parâmetro β pode ser escrito como β = 1 + λ. Em teoria, λ deve ser escolhido


de modo a exceder o slew rate máximo associado a densidade de potência do espectro do
ruı́do. Na prática, como pode ser visto na Equação (2.43), o valor de λ controla o fator
de esquecimento do filtro. Com isso, quanto maior for o valor de λ maior será a variância
de E nrsf [k]. Uma estimativa suave o suficiente para a aplicação em questão pode ser obtida
escolhendo-se λ = 0,05 [60].
Devido ao esquema de recursão a inicialização do filtro deve ser feita com cautela.
Sua má inicialização pode levar a uma polarização da estimativa nas primeiras amostras
de E nrsf [k] e, com isso, degradar o desempenho do algoritmo. Uma possı́vel solução para a
inicialização é estender S[k] nas bordas, como descrito para o TPSW (neste caso a extensão só

28
é necessária no inı́cio do espectro), e inicializar a recursão com E nrsf [k −1] = S[0]. A extensão
do espectro deve ser longa o suficiente para que qualquer influência da má inicialização seja
mitigada. Após a filtragem, os valores estimados para E nrsf [k] correspondentes à extensão
do sinal são descartados. Alternativamente, E nrsf [k − 1] pode ser escolhido como a mediana
das primeiras C amostras de S[k]. Em ambos os casos, o espectro S[k] está localizado entre
0 e π radianos.

2.6.3 Correção do Espectro

As curvas obtidas utilizando-se cada um dos métodos descritos anteriormente podem


ser vistas na Figura 2.10. Neste exemplo o sinal utilizado foi gerado artificialmente, sendo
constituı́do de uma senóide com freqüência fundamental de 1 kHz e harmônicos preenchendo o
espectro até a freqüência máxima de 22,05 kHz; as amplitudes de cada harmônicos decrescem
exponencialmente com a freqüência. Ruı́do aditivo rosa foi utilizado para simular o ruı́do de
fundo. Os parâmetros utilizados para cada método foram:

• TPSW: N sw = 51, M sw = 8, and α = 4;

• AR: q = 10;

• SSE: N sse = 101;

• NLRF: β = 1,01.

Como pode ser visto, todos os métodos se comportam de maneira similar. Um estudo sobre
o desempenho destes métodos sob diferentes circunstâncias pode ser encontrado em [52].
Uma vez de posse da curva E[k], deve-se utilizá-la para corrigir o desbalanceamento
espectral observado nos sinais de áudio. Esta correção pode ser feita pela diferença dos
espectros em dB, que corresponde à divisão do espectro original pela curva obtida, E[k].
S ′ [k] pode, então, ser escrito como:

S[k]
S ′ [k] = . (2.45)
E[k]

Desta maneira, diferenças no nı́vel médio de E[k] não influenciam a etapa da detecção
dos picos, uma vez que apenas seu formato é importante para a correção espectral. A seguir
é apresentado o algoritmo que utiliza a curva corrigida S ′ [k] para detectar e classificar os
picos espectrais.

29
tpsw ar
E E

20 20
Magnitude (dB)

Magnitude (dB)
0 0
−20 −20
−40 −40
−60 −60
0 5 10 15 20 0 5 10 15 20
Freqüência (kHz) Freqüência (kHz)
sse nlrf
E E

20 20
Magnitude (dB)

Magnitude (dB)
0 0
−20 −20
−40 −40
−60 −60
0 5 10 15 20 0 5 10 15 20
Freqüência (kHz) Freqüência (kHz)

Figura 2.10: Curvas obtidas com cada um dos métodos.

2.6.4 Critérios de Seleção de Picos

Como demonstrado na Figura 2.8, a seleção de picos é realizada sobre S ′ [k], que,
idealmente, é uma versão corrigida do espectro com distribuição de energia em função da
freqüência mais uniforme ao longo do espectro. A Figura 2.11 compara o espectro original
S[k] e sua versão corrigida S ′ [k], em um exemplo onde E sse [k] foi utilizada. Assim fica
claro que um limiar com magnitude constante pode ser empregado para discriminar os picos
genuı́nos dos espúrios.
O critério para a seleção dos picos pode ser descrito da seguinte maneira, assumindo
inicialmente a seqüência k ∈ {2, 3, . . . , (N/2−1)} de ı́ndices de S ′ [k]. Para todos os elementos
de k, agrupe em um sub-conjunto Pm os ı́ndices kpicos que satisfazem simultaneamente as

30
S[k]
Magnitude (dB)
0
Esse[k]
−20
−40
−60
0 5 10 15 20

S‘[k]
Magnitude (dB)

40 Limiar
20
0
−20
0 5 10 15 20
Freqüência (kHz)

Figura 2.11: Comparação entre o espectro original (em cima) e sua versão corrigida (em-
baixo).

seguintes condições: 
S ′ [k] > S ′ [k − 1]





S ′ [k] > S ′ [k + 1] (2.46)




S ′ [k] > dµ.

As duas primeiras condições garantem que os ı́ndices selecionados correspondem aos picos
espectrais. A terceira condição seleciona entre os picos espectrais aqueles que satisfazem um
determinado critério de energia: ser superior a um determinado limiar, nominalmente dµ. No
limiar, d é um multiplicador escolhido empiricamente e µ é um estimador do desvio-padrão
do ruı́do observado em S ′ [k]. Como o espectro utilizado é corrigido, o chão de ruı́do pode ser
considerado aproximadamente constante ao longo da freqüência, com isso, o desvio-padrão
do ruı́do corresponderia ao nı́vel médio do chão de ruı́do. O fator multiplicador d coloca o
limiar d vezes acima do chão de ruı́do e deve ser escolhido de modo que o limiar fique acima
dos picos provocados pelo ruı́do e abaixo dos picos genuı́nos. Ao final, os ı́ndices selecionados
kpicos contêm os ı́ndices associados aos picos detectados em S ′ [k].
O valor de µ pode ser obtido por qualquer estimador robusto o sufiente para prover es-
timativas para o desvio-padrão dos dados, apesar da presença de muitos outliers (neste caso,
os picos espectrais). Um possı́vel estimador é a mediana de S ′ [k]. Porém, experimental-
mente observou-se que, quando tratando um sinal densamente provoado por picos genuı́nos,

31
a mediana fornece uma estimativa superior ao valor do desvio-padrão do ruı́do.
Um outro estimador, neste caso mais robusto que a mediana, surge dos próprios
métodos utilizados para o pré-processamento espectral (com exceção da modelo AR de baixa
ordem). Dentre os métodos utilizados, o SSE mostrou ser o menos afetado pela presença de
picos genuı́nos ao estimar o ruı́do de fundo. Isto pode ser observado pela própria formulação
do método e também foi constatado através de experimentos. A nova estratégia para estimar
µ utilizando o estimador SSE é:

µ = média(Ē sse [k]), (2.47)

onde Ē sse [k] é a curva fornecida pela aplicação do método SSE ao espectro compensado S ′ [k].
Para o valor de d, pode-se assumir que o pré-processamento espectral foi bem-sucedido
em “branquear” o espectro do ruı́do e pode-se considerá-lo gaussiano. Além disso, µ pode ser
considerado um estimador confiável do desvio-padrão deste ruı́do. Desta maneira, escolhendo-
se 2 ≤ d ≤ 5, um intervalo de confiança maior que 95% é obtido para que os picos espúrios
estejam abaixo do limiar [61].
Na realidade, para uma dada razão sinal-ruı́do (SNR), quanto maior for o número de
picos genuı́nos presentes no sinal, mais difı́cil será a distinção dos picos genuı́nos do ruı́do
de fundo, devido ao espalhamento da energia do sinal pelos picos genuı́nos. Isto favorece
a ocorrência de erros de detecção e requer uma escolha mais cuidadosa de d. De maneira
inversa, a tarefa de escolher o limiar é simplificada quando o número de picos genuı́nos é
menor, até mesmo para SNRs baixas.
As condições descritas acima motivam a seguinte estratégia para selecionar um valor
adequado de d:

1. Calibrar d de modo a garantir uma detecção satisfatória considerando SNRs tão baixas
quanto 10 dB e um espectro densamente populado por picos;

2. Atribuir o antigo valor de d para dmı́n;


 ′
0.5
3. Calcular ρ = 1 ⊓ máx(S10[k])−µ , onde a ⊓ b denota “maior entre a e b”;

4. Fazer d = ρdmı́n .

Apesar de adequado para casos com muitos picos espectrais, o valor de dmı́n tende
a ser muito baixo para S ′ [k] contendo poucos picos genuı́nos. Como conseqüência, muitas
falsas detecções podem ocorrer.

32
Ao se calcular ρ, a quantidade (máx(S ′ [k])−µ) pode ser interpretada como o intervalo
disponı́vel em magnitude entre o máximo espectral e o nı́vel médio do ruı́do. Logo, se este
intervalo é maior que 10 dB, o multiplicador ρ > 1 contribui para aumentar o limiar em
aproximadamente metade do excesso de intervalo. Caso contrário, ρ = 0 e d = dmı́n. Esta
situação acontece quando existem poucos picos genuı́nos em S ′ [k], evitando a ocorrência de
falsos alarmes.
Uma outra estratégia de escolha do limiar, proposta em [8], escolhe o limiar com base
no valor máximo do espectro. Assim, a última condição para um pico válido pode ser:

S ′ [k] > dmáx(S ′ [k]). (2.48)

Nesse caso, o multiplicador d deve ser escolhido entre 0 < d < 1. Como no caso anterior, d
deve ser escolhido de modo que o limiar se situe acima do chão de ruı́do e abaixo do nı́vel dos
picos. Valores que colocam o limiar em torno de 20 dB abaixo do pico de maior magnitude
costumam fornecer resultados satisfatórios para sinais de áudio.

2.7 Métodos de Ligação dos Picos Espectrais


Os métodos de ligação dos picos espectrais têm como objetivo associar os picos de
quadros consecutivos de forma a criar um vı́nculo temporal entre estes picos. As trilhas
senoidais resultam deste vı́nculo, representando cada senóide modulada em freqüência e
amplitude do somatório da equação (1.1).
Com isso, o problema de ligação de picos espectrais pode ser descrito como uma busca
que associa os picos encontrados num quadro m aos picos encontrados no quadro m + 1
de modo a preservar a continuidade (e por conseqüência a suavidade) das modulações em
amplitude e freqüência das componentes senoidais. Os métodos devem conseguir lidar com
trilhas senoidais que se cruzam na freqüência e trilhas com modulações intensas na freqüência
e na amplitude. Além disso, os métodos devem ser robustos o suficiente para lidar com erros
da detecção de picos, nominalmente os falsos alarmes e as falhas de detecção.
O problema de encontrar as melhores ligações entre os picos considerando-se todos os
picos econtrados em todos os quadros do sinal tem complexidade computacional exponenci-
almente crescente com o número de picos. Isso leva à necessidade de se restringir a busca do
melhor pico a uma determinada região do espectro (no tempo e/ou na freqüência), reduzindo

33
a complexidade computacional. Um critério muito utilizado, por exemplo, é a proximidade
de freqüência entre dois picos adjacentes no tempo.
A solução adotada neste trabalho utiliza informações passadas dos parâmetros encon-
trados para cada trilha para encontrar o melhor pico a continuá-la. Outras soluções procuram
resolver o problema utilizando modelos ocultos de Markov [62], modelando a trajetória da
freqüência das trilhas ao longo do tempo por modelos ocultos de Markov combinatoriais.
Outra solução, que procura unificar a classificação e construção das trilhas senoidais, utiliza
um algoritmo de teoria de grafos para criar as trilhas [63]. Neste caso, o problema da criação
das trilhas é visto como um particionamento de um grafo maximamente conectado (cada nó
sendo um pico encontrado) respeitando um determinado critério baseado na proximidade de
freqüência ou de amplitude ou um critério baseado numa hipótese de harmonicidade.

2.7.1 Visão Geral

Esta seção dará uma visão geral sobre os métodos estudados para criação de trilhas
senoidais. A apresentação será feita de modo que todos os métodos a serem apresentados
possam ser vistos como instâncias especı́ficas de um algoritmo genérico.
A Figura 2.12 ilustra o processo de ligação das trilhas utilizando predição. Assume-se
que já existem trilhas formadas até o quadro m − 1 e que se deseja encontrar uma continu-
ação para estas trilhas entre os picos encontrados no quadro m. Para isto, um conjunto de
parâmetros dessas trilhas é passado a um preditor que fornece uma estimativa desses parâ-
metros para o quadro atual, m. Em seguida, no decisor, os valores preditos para as trilhas
são comparados com os parâmetros dos picos encontrados e, com base numa determinada
métrica, decide-se entre escolher ou não um pico como a continuação de uma trilha. Nesta
etapa, picos podem não ser associados a trilhas; neste caso, uma nova trilha é criada para
acomodar este pico. Também é possı́vel que trilhas não sejam associadas a picos; neste caso,
as heurı́sticas decidem o que será feito com esta trilha. Ao final, tem-se o conjunto de trilhas
para o quadro m + 1.
As trilhas senoidais fornecidas na entrada do algoritmo podem ser definidas através de
um conjunto de parâmetros que podem ser vetores ou escalares. Os parâmetros de um pico, no
entanto, são sempre escalares. Dois parâmetros sempre devem estar presentes: a amplitude
e a freqüência. No caso das trilhas senoidais, estes parâmetros são vetores correspondendo
à evolução da freqüência e da amplitude de cada parcial ao longo do tempo. No caso dos

34
Trilhas
Senoidais

Parâmetros dos picos Possı́veis Trilhas


encontrados no quadro m Decisor Heurı́sticas
Trilhas Senoidais

Estimativa
Trilhas dos parâmetros
Preditor das trilhas
Senoidais
no quadro m

Figura 2.12: Esquema de ligação dos picos espectrais por predição.

picos, estes valores são as estimativas obtidas pelos métodos descritos nas seções anteriores.
Parâmetros auxiliares podem ser utilizados durante a construção das trilhas senoidas.
Estes parâmetros, que devem ser utilizados apenas pelo algoritmo de ligação de trilhas, são
removidos das trilhas senoidais ao final da execução do algoritmo.
Na discussão subseqüente, apenas os parâmetros relevantes para o algoritmo de ligação
de trilhas serão discutidos. Deve-se lembrar que outros parâmetros podem ser armazenados
numa trilha senoidal caso sejam necessários para a aplicação final. Por exemplo, a informação
de fase pode ser armazenada na trilha mas não é utilizada por nenhum algoritmo de ligação
dos picos espectrais.

2.7.2 Algoritmo de McAulay & Quatieri

O primeiro algoritmo de ligação de trilhas senoidais foi proposto em [7] e é comumente


chamado de algoritmo de McAulay & Quatieri (algoritmo MQ). Este algoritmo, introduziu as
idéias básicas sobre o rastreamento de trilhas como, por exemplo, o critério de proximidade
em freqüência e serve de base para os outros algoritmos encontrados na literatura.
Os parâmetros utilizados pelo algoritmo MQ são a freqüência dos picos e um parâ-
metro interno ao algoritmo, chamado de ‘estado da trilha’. O parâmetro ‘estado da trilha’
pode assumir três valores: “ativo”, “dormindo” e “inativo”.
Seguindo o diagrama conceitual da Figura 2.12, o algoritmo MQ pode ser dividido em
três etapas: a predição, a decisão e suas heurı́sticas. Cada etapa do algoritmo será explicada
separadamente.

35
Predição

O bloco de predição do algoritmo MQ utiliza apenas a freqüência atribuı́da à trilha no


quadro anterior. Sendo Sm o conjunto de trilhas senoidais ativas geradas até o instante m,
com a k-ésima trilha Tm,k , e fk um vetor de comprimento m contendo as freqüências passadas
atribuı́das a Tm,k , o valor “predito” para a freqüência da trilha k no quadro m + 1 pode ser
escrito da forma:

fˆk,m+1 = fk [m]. (2.49)

Decisão

O algoritmo de decisão utiliza apenas a proximidade da freqüência de um pico com


a freqüência estimada para encontrar a melhor continuação para a trilha. Sendo Pm+1 o
conjunto de ı́ndices de picos para o quadro m+1 encontrados de acordo com a equação (2.46),
as freqüências associadas a esses picos são armazenadas no vetor f m+1 , ordenadas de acordo
com o conjunto Pm+1 , ou seja, a freqüência do pico correspondente ao primeiro elemento de
Pm+1 é o primeiro elemento do vetor f m+1 , e assim por diante. O vetor Am+1 de amplitude
dos picos encontrados no quadro m + 1 é criado de maneira similar.
O algoritmo de decisão pode ser descrito da seguinte maneira, então: para todas as
trilhas i cujo parâmetro estado não seja “inativo”, um conjunto de candidatos à continuação
da trilha, Ci , é criado com os ı́ndices j do vetor f m+1 que satisfazem o seguinte critério:

dMQ (i,j) , |fˆi,m+1 − f m+1 [j]| < η MQ , (2.50)

onde η MQ é uma constante escolhida pelo usuário. Tipicamente η MQ ≈ 0,03fˆi,m+1 , o que


equivaleria a uma variação de, aproximadamente, um semitom entre a freqüência de um
quadro e a freqüência do quadro seguinte.
Após o conjunto Ci ser obtido para todas as trilhas, deve-se verificar se existem ele-
T
mentos de Ci presentes em algum Ck , i 6= k, ou seja, Ci Ck 6= ∅. Se algum elemento de
T
Ci Ck possui o menor valor de dMQ (·) entre os elementos de Ci ou Ck , então é dito que as
trilhas i e k estão em conflito por um pico.
T
Sendo o pico j o elemento de Ci Ck que gerou o conflito entre as trilhas i e k, o
conflito entre essas trilhas é resolvido da seguinte maneira:

36
1. caso o pico j possua o menor valor1 de dMQ (i,·) entre todos os elementos do conjunto
Ci e isso não ocorra para o conjunto Ck , então o pico é removido do conjunto Ck ;

2. caso o pico possua o menor valor de dMQ (·); para os dois conjuntos, então deve-se
comparar dMQ (i,j) e dMQ (k,j) e o pico j é removido do conjunto Cl , l = i ou k, que
possua o maior valor de dMQ (l,j);

Após a resolução deste conflito, deve-se realizar uma nova busca por trilhas em conflito. Após
a resolução de todos os conflitos, o pico j pertencente ao conjunto Ci que possui o menor
valor de dMQ (i,j) é escolhido como a contiuação da trilha i. Caso Ci = ∅ então a decisão de
como atualizar os parâmetros da trilha i é deixada para as heurı́sticas que serão apresentadas
a seguir.
Um pico também pode não ser associado a nenhuma trilha. Neste caso uma nova
trilha é criada para acomodar este pico.
A associação da trilha i com o pico j é realizada da seguinte maneira:

fi [m] = f m [j], (2.51)

Ai [m] = Am [j]. (2.52)

Com isso, os parâmetros da trilha são associados aos parâmetros dos picos, completando a
atualização das trilhas (que receberam um pico) para o quadro m + 1.

Heurı́sticas

As seguintes heurı́sticas [8] são adotadas no algoritmo MQ:

1. Caso uma trilha tenha recebido um pico no quadro m, seu parâmetro estado deve ser
“ativo”.

2. Caso uma trilha não tenha recebido um pico no quadro m, seu parâmetro ‘estado’ deve
ser “dormindo”. Neste caso, os parâmetros atribuı́dos para a trilha no quadro m são os
valores preditos para este quadro, para os parâmetros que foram preditos, e a repetição
dos valores do quadro m − 1 para os parâmetros restantes.
1
Isto é um abuso de linguagem, já que na realidade quem possui esse valor são os parâmetros deste pico.

37
3. Caso uma trilha tenha permanecido no estado “dormindo” por mais que D MQ quadros,
então seu estado é modificado para “inativo”. Os parâmetros atribuı́dos à trilha nos
últimos D MQ quadros são removidos.

4. Caso uma trilha esteja no estado “inativo” e ela tenha permanecido no estado “ativo”
ou “dormindo” por menos que K MQ quadros, então a trilha é removida do conjunto Sm .

D MQ e K MQ são valores inteiros e positivos escolhidos pelo usuário.


Essas heurı́sticas têm como objetivo contornar os problemas do algoritmo de detecção
de picos. A heurı́stica 4 procura remover trilhas geradas por picos erroneamente classifi-
cados como genuı́nos. Esses picos poderiam gerar trilhas excessivamente curtas por serem
provocados por ruı́do.
Já as heurı́sticas 1 a 3 procuram permitir que, caso um pico que seria a continuação
de uma trilha ativa seja erroneamente classificado pelo detector de picos, a trilha não seja
dada como “inativa” imediatamente. Caso o pico seja corretamente detectado, em no máximo
D MQ quadros, esta trilha poderá encontrar uma continuação. Se isto não fosse feito, diversas
trilhas curtas poderiam ser geradas no lugar de apenas uma longa, levando a uma piora da
qualidade do modelo senoidal extraı́do do sinal.

Ilustração do algoritmo MQ

Essa seção busca ilustrar o funcionamento do algoritmo MQ devido a sua importância


e ao fato do seu entendimento auxiliar o entendimento dos outros algoritmos de ligação de
picos espectrais. Para isto será utilizada a Figura 2.13, que ilustra diversas possı́veis situações
que o algoritmo deve solucionar.
Na figura pode-se ver que existem trilhas em três situações: surgindo (recém-criadas),
desaparecendo (trilhas que não receberam nenhuma continuação nos últimos quadros) e ativa
(trilha já “bem-formada”). Neste contexto, as trilhas ditas “desaparecendo” possuem estado
“dormindo” e podem ser dadas como “inativas” caso não encontrem nenhuma continuação.
Na situação 1, as duas trilhas estão em conflitos pelos dois picos delimitados pela
linha pontilhada. Como o pico mais abaixo está mais próximo da trilha superior, ele ganha
o conflito e a trilha inferior no quadro pode ser ligada ao pico superior, caso este pertença ao
seu conjunto de candidatos. Caso ele não pertença, a trilha ficará sem continuação e poderá
ter seu estado alterado para “inativa”.

38
Surgindo
Pico
Trilha
Freqüência

Situação 1

Desaparecendo

Situação 2

Situação 3

Ativa Situação 4
m−3 m−2 m−1 m m+1 Quadro

Figura 2.13: Figura ilustrando diferentes situações possı́veis para o algoritmo MQ.

A situação 2 ilustra o caso simples onde apenas um pico é candidato à continuação


de uma trilha, e a decisão é facilmente resolvida. Neste caso, a trilha que estava desapare-
cendo volta a se tornar “ativa”. O mesmo pode ser visto na situação 3; desta vez, a trilha
permanece no estado “ativo”.
A situação 4 ilustra o caso em que um pico não é aproveitado por nenhuma trilha.
Uma nova trilha será criada para este pico.

2.7.3 Predição pelo Algoritmo de Burg

Uma modificação encontrada na literatura sobre o algoritmo MQ, para melhorar os


esquemas de predição e decisão pode ser encontrada em [64] e [65]. Ela utiliza um algoritmo
de predição linear sobre a freqüência e a amplitude das parciais.
Com isso, os parâmetros utilizados por este algoritmo são os mesmos utilizados pelo
método anterior adicionados do parâmetro amplitude, definido, similarmente ao parâmetro
freqüência, como Ak . A seguir os três blocos desse algoritmo serão detalhados.

Predição

A predição deste método utiliza o algoritmo de Burg [66] para estimar a freqüência
e a amplitude para a trilha k, utilizando os vetores da freqüência e amplitude passadas fk e
Ak , respectivamente.

39
O algoritmo de Burg, para isto, utiliza os NABurg e NfBurg últimos elementos dos vetores
Ak e fk , respectivamente. Assim os valores preditos para amplitude e freqüência podem ser
expressos como:

NfBurg

fˆk,m =
X
cf,k [i]fk [m − i], (2.53)
i=1

Burg
NA
X
Âk,m = cA,k [i]Ak [m − i], (2.54)
i=1

onde os coeficientes de predição linear da freqüência, cf,k , e amplitude, cA,k , são obtidos
através do algoritmo de Burg aplicado às MABurg amostras passadas mais recentes do vetor
Ak e às MABurg amostras passadas mais recentes do vetor fk .
O tamanho da janela de observação MABurg ou MfBurg para a predição está ligado ao
comportamento esperado da evolução da freqüência ou da amplitude ao longo do tempo;
quanto maior for a janela, mais informação passada é utilizada para se extrair o comporta-
mente desta trilha e menor será a influência das amostras mais recentes. Deve ser lembrado
que os parâmetros extraı́dos são amostrados de acordo com o tamanho do salto utilizado
na STFT: por exemplo, para um salto de 512 amostras e um sinal amostrado em 44,1 kHz,
seriam necessárias aproximadamente 20 amostras para se ter um perı́odo inteiro de um vi-
brato de 4 Hz na memória do preditor. Já os coeficientes de predição devem ser escolhidos
de modo a permitir a modelagem de uma grande variedade de modulações em freqüência,
como senoidais e exponenciais. Para isso, recomenda-se um comprimento superior a 2 coefi-
cientes. O mesmo raciocı́nio pode ser utilizado para os parâmetros utilizados na predição da
amplitude.
Caso o comprimento das trilhas seja menor que MABurg ou MfBurg um algoritmo de
reflexão é utilizado para preencher as memórias dos preditores. Este algoritmo, para um
vetor x de comprimento N, fornece os valores refletidos para a esquerda x[−i] = 2x[0] − x[i]
e os valores refletidos para a direita x[N − i] = 2x[N] − x[i]. Este método preserva as
continuidades de ordem 0 e de ordem 1 do sinal e pode ser utilizado para “expandir” o vetor
quando não há dados suficientes para a predição.

40
Decisão

Neste algoritmo, os conjuntos Ci são criados utilizando-se a mesma função dMQ (i,j)
do algoritmo anterior. A decisão de qual elemento do conjunto Ci utilizar como continuação
da trilha e para os critérios de solução dos conflitos utiliza a seguinte função:

dBurg (i,j) , |Âi,m − Am [j]|, (2.55)

ou seja: uma vez selecionados os candidatos utilizando-se um critério de proximidade na


freqüência, o candidato com o valor de amplitude mais próximo do valor predito é escolhido
como continuação para a trilha.

Heurı́stica

As heurı́sticas deste método são as mesmas que as adotadas pelo algoritmo MQ.

2.7.4 Predição por Filtragem Adaptativa

Um terceira solução, que traz algumas vantagens sobre o método anterior, é a utili-
zação de um filtro adaptativo [67] para a predição dos parâmetros das trilhas. Em [68] são
propostos uma solução utilizando um filtro adaptativo RLS e um novo critério de decisão.
Como no método de Burg, a predição é feita sobre a freqüência e a amplitude das trilhas,
porém com a vantagem de se poder realizar uma predição conjunta destes dois parâmetros.
Além disto, o filtro adaptativo possui propriedades desejáveis para a predição de trilhas,
como, por exemplo, o rastreamento de sinais variantes no tempo.

Predição

Assim como o preditor de Burg, o filtro adaptivo irá fazer uma predição linear da
freqüência e da amplitude das parciais com base nas freqüências e nas amplitudes passadas
da trilha. Uma ilustração do esquema pode ser visto na Figura 2.14. Neste esquema, o filtro
recebe o vetor dos parâmetros da amplitude e freqüência de uma trilha i em um quadro m e,
com base no erro, em entre o valor predito para as amostras no quadro m e o valor decidido
para este quadro, encontra os coeficientes de predição para o quadro seguinte. O algoritmo
de adaptação escolhido para o filtro foi o RLS (mı́nimos quadrados recursivo).

41
Am
fm

Ai Preditor Âi,m fˆi,m Ai [m]


Decisor
fi Adaptativo fi [m]

em

Figura 2.14: Esquema de ligação das trilhas utilizando um filtro adaptativo para a trilha i
no quadro m.

Definindo-se o vetor de saı́da do filtro adaptativo para a trilha i no quadro m como


h i
yi,m [k] = Âi,m+1 fˆi,m+1

e o vetor de entrada do filtro adaptativo como


h i
T T
xi [m] = A′i [m] f ′ i [m] ,

com:

A′ i [m] = [Ai [m] Ai [m − 1] · · · Ai [m − (J RLS − 1)]]T (2.56)

f ′ i [m] = [fi [m] fi [m − 1] · · · fi [m − (J RLS − 1)]]T , (2.57)

pode-se escrever:
yi [m] = xi [m]Wi [m], (2.58)

onde Wi [m] é uma matriz de coeficientes de comprimento 2J RLS × 2, sendo J RLS o número
de coeficientes de predição.
Dada uma escolha criteriosa de αRLS > 0 e um fator de esquecimento 0 << λRLS ≤ 1,
o problema dos mı́nimos quadrados exponencialmente pesados com regularização [69] procura
encontrar a matriz Wi [m] que minimiza
m
X
λm+1 WiT [m]Π−1
J RLS
Wi [m] + λm−l kdi [l] − xi [l]Wi [m]k2 , (2.59)
l=0

onde di [m] = [ A′ i [m + 1] f ′ i [m + 1] ] é o sinal desejado e Π−1


J RLS
= (αRLS)−1 IJ RLS , com IJ RLS
sendo uma matriz identidade de dimensão J RLS × J RLS .

42
A solução no quadro m pode ser calculada através das seguintes recursões:

γi [m] = (1 + (λRLS )−1 xi [m]Pi [k − 1]xTi [m])−1

gi [m] = (λRLS )−1 Pi [k − 1]xTi [m]γi [m]

e′i [m] = di [m] − xi [m]Wi [k − 1]

Wi [m] = Wi [k − 1] + gi [m]e′i [m]

Pi [m] = (λRLS )−1 Pi [k − 1] − gi [m]giT [m]γi−1 [m]

A matriz de coeficientes pode ser definida explicitamente como:


 
wi,AA wi,f A
Wi [m] =  , (2.60)
wi,Af wi,f f
onde cada vetor wi,bc representa o efeito de c sobre a predição de b, b ou c podendo ser
a amplitude ou a freqüência. Este esquema considera a informação da amplitude para a
predição da freqüência e vice-versa. Isto pode melhorar o desempenho do preditor, já que,
em última análise, ambos os parâmetros podem ser controlados simultaneamente pelo músico.
No entanto, dependendo do tipo de sinal, ou do nı́vel da contaminação do sinal por
ruı́do, a amplitude tende a se comportar de forma mais impreditı́vel que a freqüência cor-
respondente, levando a uma pior estimação da freqüência. Para estes casos, uma versão
alternativa pode ser utilizada, onde o vetor de coeficientes da freqüência e da amplitude são
desacoplados. Isto pode ser obtido através da seguinte simplificação sobre a matriz Wi [m]:
 
wi,AA 0
Wi[m] =  . (2.61)
0 wi,f f
Neste caso nenhuma informação cruzada é compartilhada na predição da amplitude ou da
freqüência da parcial. Assim, as ordens da predição da amplitude e da freqüência, JARLS e
JfRLS , respectivamente, podem ser diferentes, caso isto seja desejável.
No caso em que o comprimento da trilha não seja grande o suficiente ou o erro de
estimação ainda esteja muito elevado, pode-se utilizar como estimativas da amplitude e da
freqüência os valores da amplitude e da freqüência atribuı́dos à trilha no quadro anterior. Os
coeficientes do filtro, enquanto isso, devem continuar a ser atualizados.

Decisão

O esquema de decisão deste método é similar ao anterior, exceto pela substituição da


função dBurg por:

43
|fˆi,m − f m [j]| |Âj,m − Am [j]|
dRLS (i,j) , + κRLS , (2.62)
fˆi,m Âi,m
onde κRLS é um valor escolhido pelo usuário. A decisão entre a melhor continuação para a
trilha, neste caso, é feita através de uma combinação linear das distâncias normalizadas da
freqüência e da amplitude. Como a freqüência já foi utilizada na criação dos conjuntos Ci ,
costuma-se dar mais peso para a distância da amplitude nesta etapa.

Heurı́sticas

As heurı́sticas seguem as do algoritmo MQ.

2.7.5 Comentário sobre os algoritmos de ligação das trilhas

Os algoritmos apresentados nesta seção pertencem à famı́lia dos algoritmos que utili-
zam predição linear para estimar a evolução das trilhas. Este esquema é bastante apropriado
para sinais musicais, onde a evolução da freqüência e da amplitude das trilhas senoidais ao
longo do tempo são suaves. Essa suavidade, no entanto, é altamente dependente da qualidade
das etapas anteriores do modelo senoidal. Por exemplo, a qualidade da predição melhora sen-
sivelmente se saltos curtos no tempo são escolhidos, ou quando são utilizados estimadores da
freqüência e da amplitude instantâneas.
A escolha do número de coeficientes de predição e do comprimento da janela também
altera a qualidade das trilhas senoidais geradas pelo algoritmo de Burg. Uma janela muito
grande pode piorar o desempenho do algoritmo caso o sinal a ser predito não seja estacionário.
Uma janela muito curta pode levar o algoritmo a não perceber determinadas caracterı́sticas
de longo prazo do sinal. Esse problema é parcialmente resolvido pelo algoritmo adaptativo,
que leva em conta todas as amostras passadas pesadas exponencialmente, com o parâmetro
λRLS controlando o decaimento desta exponencial.
Uma última palavra deve ser dita sobre a falta de um esquema de avaliação das trilhas
obtidas. Sem uma métrica apropriada para medir a qualidade das trilhas extraı́das de um
sinal, a decisão de quais estratégias levam a uma melhora (e o valor dessa melhora) ficam
sujeitas a testes subjetivos que podem ser ou não adequados para a aplicação final. Os
métodos apresentados nesta seção ainda não foram comparados formalmente (com ou sem
uma aplicação especı́fica em mente), e apenas “palpites” teóricos ou métodos objetivos não

44
sempre apropriados para este tipo de avaliação permitem a realização de comparações da
qualidade de um método com a de outro.

2.8 Sı́ntese das Trilhas Senoidais


Apesar de o foco deste trabalho ser a obtenção do modelo senoidal muitas vezes é
necessário “escutar” o modelo obtido para avaliar a sua qualidade. Por isso, um algoritmo
de sı́ntese simples foi desenvolvido. O algoritmo usa apenas a informação da amplitude e da
freqüência das trilhas obtidas e uma fase inicial. Pelo uso da reatribuição do tempo, um vetor
contendo a estimativa do instante que melhor descreve cada elemento dos vetores contendo
as estimativas da amplitude e da freqüência também é necessário.
Algoritmos de sı́ntese de trilhas senoidais clássicos, como o encontrado em [34], uti-
lizam a informação da fase das trilhas; porém, quando estimativas precisas da freqüência
instantânea estão presentes, já foi observado em [45] que a informação de fase não se faz
necessária.
O algoritmo utiliza os seguintes parâmetros para um trilha i: o vetor fi contendo
as estimativas das freqüências da trilha em Hz, o vetor Ai contendo as estimativas das
amplitudes da trilha (adimensional) e ti contendo os tempos em segundos referentes aos
instantes que melhor descrevem os elementos contidos em Ai e fi . Caso a reatribuição do
tempo não seja utilizada, os elementos de ti são linearmente espaçados com uma distância
igual ao salto utilizado na STFT. Também é necessária a freqüência de amostragem desejada
do sinal a ser sintetizado Fs .
O primeiro passo do algoritmo é interpolar a freqüência e a amplitude para a taxa
desejada do sinal a ser sintetizado. Para a interpolação da freqüência é utilizada uma spline
cúbica [70], com o detalhe de que o eixo do tempo fornecido para o algoritmo de interpolação
ser dado pelo vetor ti . Já para a amplitude, a interpolação realizada é a linear, como é
comumente utilizado na literatura. Uma vez de posse dos vetores f̌i e Ǎi na taxa do sinal
a ser sintetizado, é necessário integrar numericamente os valores de f̌i para se obter a fase
instantanea do sinal. A integração é realizada através do método dos trapézios [70], levando
ao vetor Θ das fases instantâneas. Após isso, o sinal sintetizado referente à trilha i pode ser
obtido através da seguinte expressão:

xi [n] = Ǎi [n] cos(Θ[n]). (2.63)

45
Ao final, os vetores xi são somados, levando ao sinal sintetizado no tempo:
X
x[n] = xi [n]. (2.64)
∀i

Apesar de simples, este algoritmo fornece uma boa qualidade de sı́ntese, com a des-
vantagem de não poder ser utilizado em tempo real, já que necessita da sı́ntese individual
das trilhas.

46
Capı́tulo 3

Descrição do Programa

Este capı́tulo tem como objetivo descrever o projeto e a implementação do sistema de


análise senoidal. Para capturar as necessidades do programa, um documento de requisitos
de software foi gerado com base na norma do IEEE [71] para tais documentos. O documento
gerado pode ser visto no Apêndice A.
Este capı́tulo é dividido da seguinte maneira: primeiramente é fornecida uma visão
geral sobre o sistema projetado. Em seguida, o módulo básico (que é utilizado por ambas
as interfaces do sistema) é cuidadosamente descrito. Posteriormente, são apresentadas as
interfaces no modo texto e gráfica. Por último, é descrita a implementação dos algoritmos
apresentados no capı́tulo anterior.

3.1 Visão Geral


O grande desafio do sistema a ser implementado é preservar a flexibilidade. Com
base no algoritmo básico de análise senoidal e tendo em mente suas possı́veis ramificações, o
diagrama de blocos da Figura 2.1 foi expandido para o sistema apresentado na Figura 3.1.
Neste sistema expandido, o bloco de ‘Pré-processamento Espectral’ seria responsável por
preparar o espectro para a etapa de detecção dos picos. Já o bloco de ‘Refinamentos’ é
responsável pelo cálculo das estimativas dos parâmetros do espectro (como freqüência e
amplitude) e pela retirada de possı́veis picos que foram classificados erroneamente. As três
etapas do modelo senoidal (mapeamento tempo-freqüência, detecção de picos e rastreamento
das trilhas) sempre deverão estar presentes. Já as duas etapas adicionais (pré-processamento
espectral e refinamentos) podem ser executadas ou não, dependendo da escolha do usuário.
x[n] Decomposição S[m, k] Pré−processamento S′ [m, k] Detecção dos pm pm Rastreamento
Refinamentos Trilhas
Tempo−Freqüência Espectral Picos Espectrais das Senodais
S′ [m, k]
Parciais

Figura 3.1: Etapas modificadas para a obtenção do modelo senoidal de um sinal x[n].

Uma arquitetura modular, que pode ser vista esquematicamente na Figura 3.2, foi
esolhida para o sistema. Esta arquitetura consiste de três blocos: o módulo básico, a interface
em modo texto e a interface gráfica. A idéia é isolar o sistema de análise senoidal no módulo
básico, permitindo que o usuário o acesse apenas através das interfaces gráfica ou de modo
texto. Além disso, esta arquitetura modularizada permite que outros sistemas utilizem o
módulo básico como um bloco independente, sem a necessidade da interface gráfica ou de
modo texto.

Módulo Básico

Interface Interface
Modo−texto Gráfica

Usuário

Figura 3.2: Arquitetura proposta para o sistema implementado.

A seguinte nomenclatura será utilizada durante a descrição do programa:

• etapa – uma etapa sempre se referirá a uma das fases do modelo senoidal presentes na
Figura 3.1.

• método – um método é a implementação de um algoritmo que pode ser utilizado numa


determinada etapa.

3.2 Módulo Básico


O módulo básico implementa a estrutura que permite que os algoritmos de análise
senoidal sejam executados. Inicialmente pode-se ver que as etapas de ‘Refinamento’ e ‘Pré-
processamento espectral, que não são obrigatórias, podem possuir mais de um método as-
sociado a elas. Por exemplo, o usuário pode querer estimar a amplitude e a freqüência dos

48
picos detectados. Por isso, o módulo básico permite a escolha de até seis métodos para a
etapa de ‘Refinamento’ e de até dois métodos para a etapa de ‘Pré-processamento espectral’.
Devido à flexibilidade exigida do sistema, nenhum algoritmo especı́fico foi implemen-
tado dentro do módulo básico. O módulo básico, com isso, deve ser capaz de, uma vez
escolhido o método desejado pelo usuário, encontrar e utilizar este método. Isso aumenta
a flexibilidade do sistema, pois o módulo básico não precisa conhecer os métodos disponı́-
veis ao sistema a priori. Esta escolha de projeto, no entanto, impõe que todos os métodos
implementados devam possuir certas caracterı́siticas que serão detalhadas futuramente.
Outra escolha realizada durante o projeto foi a execução apenas uma vez de cada etapa
de análise senoidal. Outra opção considerada foi a execução dos métodos para cada quadro
de análise no tempo. Esta foi descartada porque prejudicaria métodos que necessitam de
informação entre os quadros (como o rastreamento de trilhas), exigindo que eles possuı́ssem
memória. Outra vantagem sobre o método de execução única é uma diminuição no número
de chamadas de funções e de passagens de parâmetros para os métodos.
A seguir, serão apresentados diversos aspectos e soluções utilizados durante o projeto
do módulo básico.

3.2.1 Parâmetros de Entrada

Em uma primeira análise, os parâmetros necessários para o módulo básico são o sinal,
a freqüência de amostragem deste sinal, os métodos que o usuário deseja utilizar durante a
análise e os parâmetros destes métodos. O sinal de entrada, como requisitado, é fornecido
como um vetor contendo os valores do sinal ao longo do tempo representados em ponto
flutuante de dupla precisão. A freqüência de amostragem é um escalar, e sua representação
também é em ponto flutuante de dupla precisão.
A dificuldade fica em como informar o sistema de quais métodos e respectivos pa-
râmetros deverão ser utilizados durante o processamento. Para solucionar este problema,
o sistema recebe como entrada um parâmetro do tipo struct do Matlab. Este parâmetro
possui os seguintes campos:

time_freq_mapping: [1x1 struct]


spp_slot1: [1x1 struct]
spp_slot2: [1x1 struct]
peak_detection: [1x1 struct]

49
rf_slot1: [1x1 struct]
rf_slot2: [1x1 struct]
rf_slot3: [1x1 struct]
rf_slot4: [1x1 struct]
rf_slot5: [1x1 struct]
rf_slot6: [1x1 struct]
partial_tracking: [1x1 struct]
Fs: 0

e é chamado de Main Sinus Structure, MSS. As etapas do processamento estão associadas


aos campos da MSS da seguinte forma:

• mapeamento tempo-freqüência ⇒ time_freq_mapping;

• pré-processamento espectral ⇒ spp_slot1 e spp_slot1;

• busca dos picos espectrais ⇒ peak_detection;

• refinamentos ⇒ rf_slot1, rf_slot2, rf_slot3, rf_slot4, rf_slot5 e rf_slot6;

• rastreamento das trilhas ⇒ partial_tracking.

Cada campo do MSS, com exceção do campo Fs, contém uma outra struct, chamada
de Method’s Parameters Structure (MPS) que está associada a um método especı́fico de uma
etapa do processamento. Uma possı́vel MPS possuiria os seguintes campos:

name: ‘nome_do_metodo’
desc: ‘Um metodo de exemplo’
param_1: 12
param_2: ‘um outro parametro’
param_3: 124.21

Na MPS o campo name é obrigatório, ele define qual método será utilizado na etapa de
processamento cujo campo está associado ao MPS. O campo desc é opcional e pode conter
uma curta descrição do método. Além destes dois campos, um MPS possui um campo para
cada parâmetro de entrada do método. Caso não haja nenhum método associado a alguma
etapa, o campo name da MPS deve receber a string ‘none’.

50
A MPS de um método deve ser fornecida pelo próprio método, e o mecanismo pelo
qual um outro programa ou um usuário podem obter uma MPS de um método será explicado
futuramente. Essa solução de estruturas aninhadas permite uma ampla configuração do
sistema. Deve-se notar que as etapas que podem receber mais de um método possuem mais
de um campo no MPS. As etapas são executadas seqüencialmente, conforme a ordem escrita
no MPS.

3.2.2 Estrutura das Pastas

A estrutura das pastas onde estão localizadas as rotinas do Matlab criadas para o
sistema pode ser vista na Figura 3.3. Esta estrutura é importante para o entendimento de
como as funções indicadas no MPS são localizadas pelo sistema.

raiz

Functions GUI System Templates

tfmapping spp peakdetection rf partialtracking

Figura 3.3: Arquitetura proposta para o sistema implementado.

Na Figura 3.3, o primeiro nı́vel, chamado de raiz, é o diretório onde o usuário instalou
o sistema. As pastas localizadas no segundo nı́vel hierárquico contêm as seguintes funções:

• Functions – funções que implementam a interface no modo texto;

• GUI – funções que implementam a interface gráfica;

• system – funções que implementam o módulo básico;

• Templates – arquivos que fornecem algum tipo de auxı́lio para o usuário, como, por
exemplo, MSSs já preenchidas.

Sob a pasta System existem a rotina sn_analysis e uma pasta para cada etapa do
processamento. Cada uma destas pastas contém as rotinas que implementam os métodos em

51
cada etapa. O sistema foi projetado de tal maneira que para se adicionar um método para
uma das etapas basta adicionar a rotina na pasta correspondente à etapa. Quando a função
sn_analysis recebe o MSS contendo o MPS de cada etapa, ela realiza uma busca na pasta
correspondente à etapa pelo método que deve utilizar.

3.2.3 Formato de um Método

Nesta subseção, é descrito o formato de uma rotina de Matlab que possa servir como
um método do sistema. Já foi mostrado que o método necessita de dois comportamentos:
realizar o processamento propriamente dito e fornecer ao usuário o MPS correspondente a
ele.
Além disso, especificou-se que um método tem que ser capaz de inicializar seus parâ-
metros antes do processamento. Isto traz algumas vantagens, sendo a maior delas permitir
verificar se o usuário preencheu corretamente todos os parâmetros do método antes de come-
çar a análise. Assim, quando for o caso, uma mensagem de erro é dada ao usuário logo após
a tentativa de se inicializar o método, evitando que o erro ocorra durante o processamento,
quando outras etapas já poderão ter sido executadas. Outra vantagem é a diminuição do
número de argumentos passados para o método durante a execução.
Um problema a ser considerado é a necessidade de diferentes argumentos de entrada
e saı́da para diferentes métodos. A solução para isso é permitir que o projetista do método
possa escolher (dentro do próprio método) quais serão os argumentos de entrada e saı́da.
Estas, a princı́pio, correspondem às etapas que não são opcionais e, por isso, possuem seus
argumentos de entrada e saı́da conhecidos. Estes argumentos serão descritos na próxima
subseção, nesta subseção será descrito o mecanismo pelo qual esta escolha é realizada.
Este problema foi contornado adicionando-se mais um comportamento ao método: o
método retorna para a função que o chamou dois ponteiros para duas subfunções suas. Essas
duas subfunções são responsáveis por indicar quais parâmetros devem ser utilizados como
entradas e saı́das do método em questão. A função responsável pelos argumentos de entrada
do método se chama input_handle e a função responsável pelos argumentos de saı́da se
chama output_handle.
A função input_handle possui um argumento de entrada e um argumento de saı́da.
O argumento de entrada é a posição do método nas etapas de processamento. Por exemplo,
se o método estiver no campo spp_slot1 do MSS a função é chamada com o argumento

52
2. Assim a função pode se adaptar em função do seu posicionamento dentro do sistema. A
saı́da desta função é uma string do tipo ‘var = input_var_1,input_var_2,...’. Essa
string deve conter o nome dos argumentos de entrada da função nas variáveis input_var_n
na ordem em que as variáveis são esperadas pelo método.
A função output_handle também possui um argumento de entrada e um argumento
de saı́da. O argumento de entrada desta função é a saı́da do processamento do método. O
argumento de saı́da não é especificado. Esta função utiliza uma função padrão do Matlab
chamada assignin. A função assignin permite que uma variável no escopo da função que
chamou o output_handle seja modificada. Assim, para escolher quais saı́das do processa-
mento do método são associadas a uma variável da função que o chamou, basta, para cada
saı́da do processamento, adicionar um comando do tipo assignin(‘caller’,‘variable
you choose’,some_val), onde ‘variable you choose’ é uma string contendo o nome
da variável que receberá o valor some_val e some_val é fornecido na entrada da função
output_handle como uma saı́da do processamento.
A utilização destas funções na função sn_analysis será explicada detalhadamente
mais à frente.
A solução para a necessidade de diferentes comportamentos para o método foi possibi-
litar a variação do número de argumentos na entrada e na saı́da do método. As combinações
válidas de número de argumentos de entrada, Nin , e número de argumentos de saı́da, Nout ,
bem como a especificação destes argumentos e do comportamento esperado do método são:

• Nin = 0 e Nout = 1:

– Entrada: nenhuma.

– Saı́da: MPS do método.

– Comportamento: o método deve retornar o seu MPS.

• Nin = 0 e Nout = 2:

– Entrada: nenhuma.

– Saı́da: ponteiros para as funções input_handle e output_handle do método.

– Comportamento: o método deve retornar ponteiros para seu input_handle e


output_handle.

• Nin = 1 e Nout = 1:

53
– Entrada: MPS.

– Saı́da: uma nova estrutura de parâmetros.

– Comportamento: o método deve validar o MPS recebido, salvar os parâmetros1 e


retornar uma nova estrutura de parâmetros (possivelmente vazia).

• Nin > 1:

– Entrada: escolhida pela função input_handle.

– Saı́da: resultado do processamento do método (entrada da função output_handle.

– Comportamento: processamento do método propriamente dito.

A estrutura de parâmetros retornada após a inicialização é utilizada caso o método


possua algum parâmetro que possa variar durante a execução do sistema. Estas estruturas
estão disponı́veis como possı́veis entradas para outros métodos.
Deve-se notar que apenas os métodos das etapas opcionais necessitam das funções
input_handle e output_handle. Assim o comportamento para Nin = 0 e Nout = 2 só é
necessário para os métodos opcionais. Os outros comportamentos devem estar presentes em
todos os métodos.
Para facilitar a implementação de métodos para o sistema, foi criado um template
já com todos os comportamentos escritos e as funções input_handle e output_handle de-
finidas, bem como uma função para validar o MPS. O template é distribuı́do junto com o
sistema e pode ser encontrado na pasta Template.

3.2.4 A Função sn_analysis

A função sn_analysis é responsável pela implementação do sistema de análise e é


encontrada na pasta System. Esta função recebe o sinal de entrada e o MSS contendo a
configuração do sistema desejada pelo usuário. A saı́da desta função é uma estrutura con-
tendo as trilhas senoidais obtidas. As informações contidas na estrutura de saı́da dependem
do método de ligação de picos espectrais escolhido pelo usuário.
1
Os parâmetros são salvos em variáveis que possuem persistência, já que elas precisam permanecer na
memória após o fim da execução da função.

54
Assim como os métodos, essa função possui um segundo comportamento: caso a
função não receba nenhum argumento de entrada, ela retorna a estrutura MSS com seus
campos não preenchidos.
A função sn_analysis pode ser dividida nas seguintes etapas seqüenciais:

1. Criação da estrutura de arquivos.

2. Definição das variáveis.

3. Validação dos argumentos de entrada.

4. Busca dos métodos escolhidos pelo usuário.

5. Inicialização dos métodos.

6. Busca das funções de entrada e saı́da para os método.

7. Execução dos métodos.

8. Remoção da estrutura de arquivos.

As etapas 1 e 8 consistem na adição (e remoção) da estrutura de arquivos do sistema


no path do Matlab. Isto é necessário para que a função possa encontrar os métodos escolhidos
pelo usuário. Além disso, as pastas são incluı́das no inı́cio do path, garantindo que o Matlab
utilize as funções que estão sob a pasta do sistema.
Na etapa 2, as seguintes variáveis são definidas:

• Fs , uma variável global que contém o valor da freqüência de amostragem do sinal de


entrada.

• MSS.

• Um vetor booleano contendo a informação de quais campos do MSS são opcionais.

• Um vetor de ponteiros de funções chamado fun_vec, no qual cada elemento corresponde


a uma etapa do processamento.

• Uma matriz de ponteiros de funções chamada io_handle_mat. O número de linhas


desta matriz corresponde ao número de métodos opcionais do sistema. Cada linha, en-
tão, conterá os ponteiros para as funções de entrada (primeira coluna) e saı́da (segunda
coluna) dos métodos opcionais.

55
• Um vetor de parâmetros chamado param_vec. Este vetor contém os parâmetros retor-
nados pelos métodos após a inicialização.

Na etapa 3, o MSS recebido como argumento é passado para uma função que o
compara com o MSS definido na etapa 2. Caso seja encontrada alguma discrepância, uma
mensagem de erro é acionada. A maneira como o sistema trata esses erros é descrita na
Seção 3.2.5.
A etapa 4 busca os métodos definidos no MPS de entrada e adiciona os ponteiros para
estes métodos no vetor fun_vec. A associação de uma string com um ponteiro para uma
função é feita através da função str2fun do Matlab. Esta função realiza a busca de um
arquivo .m (que esteja no path do Matlab) cujo nome seja igual à string que é fornecida
como entrada da função, e retorna um ponteiro para a função contida neste arquivo. Caso
o nome da função seja none, o ponteiro para uma função previamente definida que retorna
um vetor vazio é adicionado à posição correspondente do vetor fun_vec.
Uma vez preenchido o vetor fun_vec, os métodos são inicializados um a um na etapa 5.
Nesta etapa o MPS correspondente a cada método é fornecido como argumento e espera-se
que o método retorne uma outra estrutura contendo os parâmetros que podem ser passados
durante a execução do método. Estas estruturas são salvas no vetor param_vec, sendo
ordenadas de acordo com a posição do método no MPS.
Na etapa 6, os métodos opcionais são chamados de modo a retornarem os ponteiros
para suas funções de entrada e saı́da. Estes ponteiros, por sua vez, são armazenados na
matriz io_handle_mat.
Na etapa 7, onde os métodos são executados, obtém-se o modelo senoidal. Para
isto, primeiramente serão descritos os argumentos de entrada e saı́da das etapas opcionais.
Para as funções opcionais, os argumentos de entrada são escolhidos chamando-se a função
input_handle (cujo ponteiro está armazenado na primeira coluna da matriz io_handle_mat).
A saı́da desta função (uma string) é passada para a função eval do Matlab; essa função
executa a string recebida como um comando. Desta maneira, a chamada de um método
opcional segue o formato:

output_k = fun_vec{k}(eval(io_handle_mat{k,1}(k)),param_vec{k});

Neste exemplo, o método ocupa a k-ésima posição no MSS (que supostamente corresponde
a uma etapa opcional). Como dito anteriormente, param_vec{k} contém uma estrutura de
parâmetros para o método em questão.

56
A saı́da de um método opcional, por sua vez, pode ser obtida através da seguinte
chamada:

io_handle_mat{k,2}(output_k);

Assim, a função io_handle_mat atribui os valores da saı́da do método (output_k) para as


variáveis desejadas (utilizando a função assignin).
As etapas não-opcionais possuem suas entradas e saı́das já definidas; elas são:

• Mapeamento Tempo-Freqüência:

– Entrada: vetor contendo o sinal a ser modelado, input_signal.

– Saı́da: estrutura contendo o espectro e informações adicionais, time_freq_struct.


Esta estrutura deve conter um campo chamado S contendo o espectro complexo
(uma matriz).

• Busca dos Picos Espectrais:

– Entrada: a matriz pd_input.

– Saı́da: um cell array contendo os ı́ndices dos picos em cada quadro, peaks.

• Rastreamento dos Picos Espectrais:

– Entrada: o cell peaks e a estrutura time_freq_struct.

– Saı́da: uma estrutura contendo as trilhas, chamada tracks.

A matriz pd_input é o campo S da estrutura time_freq_struct atribuı́do logo após o ma-


peamento tempo-freqüência. Além das entradas descritas acima todos os métodos possuem
como entrada a estrutura armazenada na sua posição no vetor param_vec.
Desta maneira, as entradas dos métodos atribuı́das às etapas opcionais podem ser:
o vetor de entrada, a estrutura time_freq_struct, a matriz pd_input, o cell peaks, os
MPSs e os parâmetros contidos na estrutura param_vec. As saı́das devem ser: as estruturas
time_freq_struct, a matriz pd_input e o cell peaks. Outras saı́das também podem ser
utilizadas, porém não serão utilizadas pelos métodos nas etapas não-opcionais.
O esquema descrito nesta seção, permite que a função sn_analysis seja altamente
modular. Apenas as etapas essenciais ao modelo senoidal possuem entradas e saı́das fixas,
permitindo que as etapas possuam uma grande liberdade. Além disso, uma vez que não há

57
necessidade do conhecimento prévio de nenhum método (apenas a localização dos arquivos
que os contêm), novos métodos podem ser incluı́dos no sistema através da adição do método
à pasta correspondente.

3.2.5 Manipulação de Erros

A função sn_analysis não realiza nenhum tratamento de erros que possam ocorrer
durante a execução dos métodos. Apesar disso, as funções do sistema possuem uma sintaxe
para os erros. Desta maneira, algum outro sistema pode realizar o tratamento de erro, caso
seja necessário.
Se durante a execução do sistema um erro for detectado, o método no qual ocorreu o
erro deve realizar o seguinte comando:

error(‘Sinus:Metodo:id_do_erro’,‘Mensagem de erro’);

O comando error do Matlab pára a execução da função e retorna para a função que chamou
a função causadora do erro. Esta função, por sua vez, pode tratar ou não o erro (através
da função catch). Caso o erro não seja tratado, a função no nı́vel acima é parada, e assim
sucessivamente. Ao final, caso o erro não seja tratado por nenhuma função a mensagem
contida no segundo argumento da função error é exibida ao usuário. O primeiro argumento
da função error é o identificador do erro. Ele deve conter como primeiro elemento o nome
do sistema (Sinus), em seguida o nome do método que causou o erro e, por último, um
identificador do erro dentro deste método, todos separados por “:”. Assim, caso necessário,
o método que causou o erro pode ser claramente identificado dentro do sistema.

3.3 Interface no Modo Texto


A interface no modo texto do sistema projetado consiste de uma série de funções que
têm como objetivo auxiliar o usuário a obter os MPSs, montar o MSS e visualizar as trilhas
obtidas.
Primeiramente, o usuário deve poder identificar quais métodos estão disponı́veis para
cada etapa do processamento do sistema. A função sn_list_methods, quando chamada sem
nenhum parâmetro, fornece uma listagem de todos os métodos disponı́veis em cada etapa do
sistema, juntamente com suas definições. Além disso, é possı́vel obter os métodos para uma

58
etapa especı́fica; para isto, basta utilizar como argumento para a função sn_list_methods
o nome da etapa. Para obter a listagem, esta função percorre a estrutura dos arquivos
procurando pelos arquivos .m disponı́veis em cada pasta. Quando apenas os métodos de
uma etapa são desejados, a função realiza a busca apenas na pasta correspondente a esta
etapa.
A função sn_get_parameters recebe como entrada o nome do um método (escolhido
entre os métodos listados pela função sn_list_methods) e retorna o MPS correspondente a
este método. Caso nenhum argumento seja fornecido, essa função retorna o MSS. Assim, o
usuário pode obter facilmente o MSS e os MPSs desejados sem precisar saber a sintaxe dos
métodos e o seu posicionamento dentro do sistema.
Outras funções auxiliares que manipulam o MSS são as funções sn_save_param e
sn_load_param. A primeira possui dois argumentos como entrada, um MSS a ser salvo e
o nome do arquivo em que ele deve ser salvo. A função, então, salva a estrutura MSS no
arquivo especificado com a extensão .param. Já a função sn_load_param recebe o nome de
um arquivo como entrada e retorna a estrutura MSS salva neste arquivo. O MSS é salvo
utilizando-se o formato padrão do Matlab.
A função sn_show_methods recebe como entrada um MSS e retorna o nome de cada
método atribuı́do a cada etapa do processamento. Ela permite uma rápida visualização da
configuração do sistema.
A função de visualização das trilhas obtidas é a sn_plot. Esta função recebe como
entrada a estrutura das trilhas obtidas pelo sistema e exibe dois gráficos: a variação da
amplitude contra o tempo e a variação da freqüência contra o tempo para todas as trilhas.
A função também pode receber como entrada uma opção de se exibir um dos dois gráficos
(amplitude ou freqüência) e uma opção de se exibir apenas algumas trilhas. A informação
de quais trilhas devem ser exibidas é fornecida pelo números das trilhas dentro da estrutura
tracks.
As trilhas obtidas também podem ser salvas em e lidas de arquivos, as funções que
permitem isso são a sn_save_tracks e a sn_load_tracks. A função sn_save_tracks recebe
como argumentos de entrada as trilhas e o nome do arquivo em que elas devem ser salvas.
As trilhas são salvas num arquivo binário de forma seqüêncial. O número de trilhas é salvo
como um inteiro positivo e em seguida o comprimento dos vetores da primeira trilha é salvo
também como um inteiro positivo. Em seguida, os valores contidos nesses vetores são salvos

59
em ponto flutuante de dupla precisão. A ordem em que os vetores são salvos é a seguinte:
“amplitude”, “freqüência” e “fase”. Em seguida um inteiro positivo indica o comprimento dos
vetores da segunda trilha obtida, e assim sucessivamente. A extensão .trk é acrescida ao
nome fornecido pelo usuário ao arquivo onde as trilhas são salvas. A função sn_load_tracks
desempenha o papel inverso, lendo as trilhas salvas em um arquivo cujo nome é fornecido
como argumento para a estrutura de trilhas. As trilhas não são salvas no formato padrão do
Matlab para facilitar a leitura delas por sistemas em outras linguagens.
A última função implementada no modo-texto é a sn_synth; esta função implementa
o método descrito na Seção 2.8. Os argumentos de entrada desta função são as trilhas obtidas
e a freqüência de amostragem desejada para o sinal a ser sintetizado. A saı́da é um vetor
contendo as amostras do sinal sintetizado na taxa de amostragem especificada.

3.4 Interface Gráfica


A interface gráfica fornece as mesmas funcionalidades da interface no modo texto. A
Figura 3.4 mostra a principal janela da interface gráfica. Nesta interface, os controles ficam
na parte inferior. Estes controles são divididos em 5 partes. Uma parte está relacionada à
leitura e gravação de arquivos. Nesta parte há botões para: ler o arquivo contendo o sinal
de entrada (do tipo wav), salvar e ler parâmetros, salvar as trilhas obtidas e salvar o sinal
ressintetizado.
Em seguida existe a parte referente ao controle das trilhas, onde se pode analisar o
sinal de entrada e sintetizar as trilhas obtidas. Também é possı́vel escutar o sinal original e
o sinal sintetizado, caso uma saı́da de som esteja disponı́vel ao sistema.
Por último, restam os controles para a visualização de informações das trilhas. Pode-se
visualizar nos eixos do centro da janela: o sinal original, o sinal sintetizado, a amplitude das
trilhas variando ao longo do tempo ou a freqüência das trilhas variando ao longo do tempo.
Também pode-se escolher para quais trilhas as variações da freqüência e da amplitude serão
visualizadas. Um último campo exibe informações do sinal lido (o nome do arquivo) e se ele
já foi analisado e/ou sintetizado.
Os botões de controle ficam ativos (podem ser pressionados) de acordo com o estado
do sistema. Por exemplo, se o sinal foi lido, mas não foi analisado, o botão de análise estará
ativo mas o de sı́ntese estará inativo.

60
Figura 3.4: Exemplo da tela principal da interface com o usuário.

Os parâmetros utilizados na análise estão localizados no lado direito da janela. Cada


etapa do processamento possui um drop down box associado. Os métodos disponı́veis para
cada etapa aparecem como opções para o usuário. Após escolher o método, o usuário pode
escolher os parâmetros de cada método selecionando o botão edit. Um exemplo de uma
janela de edição de parâmetros pode ser visto na Figura 3.5.
A interface gráfica monta as janelas de edição de parâmetros para cada método auto-
maticamente. Assim, um método adicionado ao sistema fica disponı́vel na interface grá-
fica sem a necessidade da confecção de uma janela de edição de parâmetros. A rotina
sn_param_edit_menu recebe como entrada um MPS e cria uma janela de modo que os
parâmetros destes MPS possam ser editados. Todos os parâmetros são considerados como
valores numéricos.
O sistema permite que sejam utilizadas janelas de edição de parâmetros especı́ficas
para um método. Isto pode ser necessário caso algum parâmetro de entrada não seja numé-
rico. Para um método possuir uma interface gráfica própria, deve possuir um arquivo .m na
pasta gui cujo nome é o nome do método acrescido de ‘_gui’. Este arquivo deve conter

61
Figura 3.5: Exemplo da tela de edição dos parâmetros de um método.

uma função cujo argumento de entrada seja o MPS vazio e cujo argumento de saı́da seja
o MPS preenchido do método. Antes de executar a função sn_param_edit_menu para um
determinado método, o sistema procura pela função de edição de parâmetros do método na
pasta gui.
Caso um erro ocorra durante a execução dos métodos, a mensagem de erro fornecida
pelo método é exibida em uma janela juntamente com um aviso sonoro.

3.5 A Função sinus()


A maneira mais simples de o usuário acessar a interface de modo texto e/ou a interface
de modo gráfico é através da função sinus. Sem nenhum argumento na entrada, a função
inicia a interface gráfica. As outras maneiras de o usuário utilizar esta função são:

• tracks = sinus(‘input_file.wav’,param) – analisa o sinal contido no arquivo es-


pecificado, utilizando o MSS informado. Neste caso, o campo Fs do MSS não precisa
ser preenchido, já que pode ser obtido do arquivo.

• tracks = sinus(input_vector,param) – neste caso, o vetor passado como argumento


é analisado utilizando o MSS fornecido. É necessário o preenchimento do campo Fs no
MSS.

• sinus(‘input_file.wav’,param,‘GUI’) – inicia a interface gráfica com o arquivo e


MSS indicados.

62
Assim, através da função sinus e possivelmente com as funções presentes na interface de
modo texto, o usuário consegue obter as trilhas senoidais. A função sinus fica localizada no
diretório onde o usuário instalou o sistema.
Mais informações de como utilizar estas funções e sua sintaxe podem ser vistas no
Manual do Usuário (Anexo B) do sistema.

3.6 Métodos Implementados


Nesta seção, é descrita a implementação dos algoritmos apresentados no capı́tulo ante-
rior dentro do sistema projetado. Durante o levantamento dos requisitos, foram especificados
as entradas e saı́das de cada algoritmo e seus parâmetros. Esta seção busca detalhar as de-
cisões de implementação tomadas para os métodos. Os campos definidos no MPS de cada
método serão associados, quando possı́vel, aos parâmetros definidos no capı́tulo anterior.

3.6.1 Métodos de Mapeamento Tempo-Freqüência

O único método implementado para o mapeamento tempo-freqüência foi a STFT. O


método criado para implementá-la é chamado stft e os campos de sua MPS (além do campo
name obrigatório) são:

• window – entrada que indica qual o nome da janela a ser utilizado; deve ser uma string;

• window_len – duração da janela em segundos;

• fft_len – número de pontos utilizados na DFT;

• hop – salto utilizado entre os quadros, em segundos;

• zero_phase_flag – diferente de zero para habilitar o algoritmo de janelamento com


fase zero.

A implementação considera que a primeira janela sempre está centrada no primeiro ponto
do sinal de entrada. A saı́da do método, a estrutura time_freq_struct, possui os seguintes
campos:

• S – matriz; cada coluna representa o espectro do sinal em um quadro com as linhas


Fs
representando a freqüência entre 0 e ;
2

63
• t – matriz de dimensão igual à de S, com cada elemento representando o tempo (em
segundos) do centro do quadro para o elemento na mesma posição na matriz S;

• f – matriz de dimensão igual à de S, com cada elemento representando a freqüência


(em Hz) correspondente ao centro de cada raia da DFT para o elemento na mesma
posição na matriz S;

• X_out – matriz contendo o sinal segmentado, cada coluna representa o segmento do


sinal utilizado para o cálculo do espectro naquele quadro;

• window_out – janela utilizada na STFT.

Além da matriz contendo o espectro, o método stft fornece outros dados que auxiliam
os métodos seguintes. Essas informações, apesar de não serem estritamente necessárias,
facilitam a implementação e diminuem a quantidade de operações dos outros métodos.

3.6.2 Métodos de Pré-processamento Espectral

Modelagem AR de Baixa Ordem

Este algoritmo de Pré-processamento Espectral foi implementado no método


spp_ar_whitening. Este método escolhe como entrada a estrutura time_freq_struct e
como saı́da a matriz pd_input. O modelo AR do sinal em cada quadro é calculado pelo
método de Burg e seu espectro de magnitude subtraı́do do espectro obtido para este quadro.
Em seguida, o espectro corrigido é armazenado na matriz pd_input. O único parâmetro
deste método no MPS é ar_len, que corresponde ao comprimento do modelo AR (q) para
cada quadro.

Two-Pass Split Window

O algoritmo TPSW foi implementado no método spp_tpsw; a entrada e a saı́da deste


método são a matriz pd_input. O cálculo da curva espectral é feito utilizando-se o algoritmo
apresentado anteriormente para cada quadro e as curvas obtidas são subtraı́das do espectro
de magnitude. Os parâmetros deste método são os parâmetros da janela split window :

• win_len – metade do comprimento total da janela em amostras, N sw ;

• win_gap – metade do número de zeros no centro da janela em amostras, M sw ;

64
• sm_th – limiar de suavização em dB, α.

Estimação do Espectro Estocástico

O algoritmo SSE foi implementado no método spp_sse e possui como entrada e como
saı́da a matriz pd_input. O cálculo da curva é feito utilizando o algoritmo de reflexão
das bordas do espectro (que é estendido em 20%). Após a obtenção das curvas, elas são
subtraı́das da matriz pd_input. O parâmetro de entrada, que corresponde ao campo f_len
do MPS deste método, é o comprimento do filtro de suavização (em amostras), N sse .

Filtro Recursivo Não-Linear

O método que implementa este algoritmo se chama spp_nrsf. Como os outros mé-
todos descritos anteriormente, a entrada e a saı́da deste algoritmo são a matriz pd_input.
A inicialização do filtro foi feita utilizando-se a mediana de um bloco contendo 10% das
amostras iniciais do espectro. O parâmetro de entrada do filtro é o fator de esquecimento
(β) do filtro e corresponde ao campo forg_fact do MPS do método.

3.6.3 Métodos de Busca dos Picos Espectrais

Todos os Picos

Este algoritmo, implementado no método ap, seleciona todos os picos do espectro.


Ele não possui nenhum parâmetro de entrada.

Limiar Constante – mediana

Este algoritmo, implementado no método ct_median, utiliza a heurı́stica apresentada


na Seção 2.6.1 para selecionar os picos espectrais. O seu parâmetro é o multiplicador da
mediana e corresponde ao campo median_mult, dmin, do MPS do método.

Limiar Constante – máximo

Este algoritmo, implementado no método ct_max, seleciona o limiar de acordo com


o máximo do espectro. O parâmetro de entrada é chamado de threshold e indica quantos
dBs abaixo do valor máximo do espectro o limiar deve ser posicionado.

65
3.6.4 Métodos de Refinamentos

Reatribuição de Freqüência

O algoritmo de reatribuição de freqüência foi implementado no método rf_freq_rea.


Este método possui como entrada e como saı́da a estrutura time_freq_struct. O algoritmo
encontra a estimativa da derivada da janela e recalcula a STFT com esta estimativa. Esta
nova STFT é utilizada para encontrar os novos pontos da freqüência, para cada quadro,
que são armazenados no campo f da estrutura time_freq_struct. Este método não possui
nenhum parâmetro de entrada.

DFT1

O algoritmo DFT1 implementado no método rf_dft1 funciona de maneira muito


similar à reatribuição da freqüência. As entradas e saı́das são as mesmas, a única modificação
é que o campo f da estrutura time_freq_struct é substituı́do pela estimativa da freqüência
fornecida pela DFT1.

Método da Diferença de Fases

Este algoritmo foi implementado no método rf_phase_diff e possui como entrada


e como saı́da a estrutura time_freq_struct. Assim como os outros métodos de estimação
de freqüência instantânea, este algoritmo sobrescreve o campo f da time_freq_struct. O
único parâmetro deste algoritmo é o atraso utilizado para o cálculo da estimativa, situado
no campo delay do MPS do método, d.

Método da Diferença de Fases Iterativo

Este método funciona da mesma maneira que o método anterior, porém utilizando
iterações do método anterior. Ele foi implementado no método rf_phase_diff_it e possui
o mesmo parâmetro do método rf_phase_diff.

Reatribuição do Tempo

A reatribuição do tempo foi implementada no método rf_time_rea e possui como


entrada a estrutura time_freq_struct. Este método utiliza a janela multiplicada por uma
rampa no tempo para o cálculo de uma nova STFT e a utiliza para a estimação do atraso de

66
grupo para cada quadro. Estas estimativas são atribuı́das ao campo t da time_freq_struct.
Este método não possui nenhum parâmetro de entrada.

Time Crop

Este algoritmo, implementado no método rf_time_crop, recebe como entradas a


estrutura time_freq_struct e a cell peaks e fornece como saı́da a cell peaks. Ele possui
um parâmetro de entrada chamado max_time_offset, fornecido em segundos. O algoritmo
verifica quais picos possuem o valor no campo t acima do valor determinado pelo parâmetro
de entrada e remove estes picos do cell peaks.

Correção da Amplitude e da Fase – simples

A correção de amplitude e fase simples utiliza apenas a estimativa da freqüência para


estimar a fase e a amplitude. O algoritmo foi implementado no método rf_amp_corr_sim,
que possui como entradas a estrutura time_freq_struct e a cell peaks. As estimativas
de amplitude e fase são feitas apenas para os picos detectados, diminuindo a complexidade.
Os parâmetros estimados, então, são atribuı́dos à posição correspondente ao pico na matriz
S da time_freq_struct. Este algoritmo não possui parâmetros de entrada.

Correção da Amplitude e da Fase – matricial

Este algoritmo funciona de forma similar ao anterior, mas utilizando a formulação


matricial, e foi implementado no método rf_amp_corr. As entradas e saı́das são as mesmas
utilizadas no método apresentado anteriormente. Este método também não possui parâme-
tros de entrada.

3.6.5 Métodos de Rastreamento das Parciais

Algoritmo de McAuley & Quatieri

O algoritmo MQ de rastreamento de trilhas foi implementado no método mq. O MPS


deste método contém os seguintes parâmetros:

• max_freq_var – valor de η MQ em %;

• max_inactive_time – tempo máximo que uma trilha pode permanecer no estado “dor-
mindo” (D MQ ), em segundos;

67
• min_track_len – duração mı́nima permitida para uma trilha (K MQ ), em segundos.

Predição Linear – Burg

O algoritmo de predição linear utilizando o método de Burg foi implementado no


método lp_burg. O MPS deste método contém todos os campos do MPS do método mq
acrescidos dos campos:

• amp_pred_win – duração, em amostras, da janela de predição da amplitude (MABurg );

• freq_pred_win – duração, em amostras, da janela de predição da freqüência (MfBurg );

• amp_pred_len – número de coeficientes de predição para a amplitude (NABurg );

• freq_pred_len – número de coeficientes de predição para a freqüência (NfBurg );

Predição Linear – RLS I

O algoritmo RLS que utiliza a predição conjunta da amplitude e da freqüência foi


implementado no método lp_rls_joint. O MPS deste método possui os seguintes campos
(além dos campos do MPS do método mq):

• pred_len – número de coeficientes de predição (J RLS );

• forg_factor – fator de esquecimento (λRLS );

• reg_factor – fator de regularização do filtro (αRLS).

Predição Linear – RLS II

O algoritmo RLS utilizando a predição independente da amplitude e da freqüência foi


implementado no método lp_rls. O MPS deste método possui os seguintes campos (além
dos campos do MPS do método mq):

• amp_pred_len – número de coeficientes de predição da amplitude (JARLS );

• freq_pred_len – número de coeficientes de predição da freqüência (JfRLS );

• amp_forg_factor – fator de esquecimento do filtro preditor da amplitude (λRLS


A );

• freq_forg_factor – fator de esquecimento do filtro preditor da freqüência (λRLS


f );

68
RLS
• amp_init_factor – fator de regularização do filtro preditor da amplitude (αA );

• freq_init_factor – fator de regularização do filtro preditor da freqüência (αfRLS ).

69
Capı́tulo 4

Exemplos

Neste capı́tulo são apresentados alguns exemplos ilustrativos da obtenção de trilhas


senoidais utilizando-se o sistema SINUS. O objetivo é ilustrar o funcionamento do sistema e
exibir como diferentes métodos influenciam as trilhas obtidas.
Dois sinais são utilizados para isto, um sinal sintético (gerado artificialmente) e um
sinal real (retirado de uma gravação). O primeiro sinal será utilizado para demonstrar como
os diferentes métodos de refinamento podem ser utilizados. O segundo sinal demonstra a
diferença de desempenho dos métodos de ligação de picos espectrais e como eles se comportam
em uma situação real.

4.1 Sinal Modulado em Amplitude e Freqüência


O sinal de teste utilizado foi um sinal do tipo s(t) = A(t) cos(Φ(t)), ou seja, um sinal
muito próximo do modelo adotado. O objetivo disto é ver se, neste caso ideal, o sistema
obtém corretamente os parâmetros deste sinal.
A função de modulação em amplitude utilizada pode ser vista na Figura 4.1. Este tipo
de modulação é uma aproximação grosseira da modulação observada em sinais gerados por
alguns tipos de instrumentos musicais. A rampa inicial modelaria o ataque do instrumento,
a região constante modelaria a sustentação da nota e, por último, a rampa decrescente
modelaria o decaimento da nota.
A modulação em freqüência deste sinal foi escolhida de maneira que a primeira deri-
vada da fase em função do tempo fosse da seguinte maneira: Φ′ (t) = 2π440 + A(t) sen(2π8t).
Assim, a freqüência instantânea deveria se assemelhar a uma senóide com freqüência de 8 Hz
1

0,8

0,6
A(t)

0,4

0,2

0
0 0,5 1 1,5 2
tempo (s)

Figura 4.1: Modulação em amplitude do sinal 1, A(t)

modulada por A(t) e somada de uma constante de valor 440 Hz. O objetivo disto é tentar
simular um tom puro com freqüência de 440 Hz com um vibrato de 8 Hz. A função A(t)
é utilizada na modulação em amplitude e na modulação em freqüência por uma questão de
praticidade.
Este sinal, que será referido futuramente como sinal 1, foi gerado amostrando-se a
função s(t) com uma freqüência de amostragem de 44,1 kHz. A duração do sinal é de 2
segundos devido ao valor da função A(t) ser zero fora deste intervalo. A seguir diversas
configurações do sistema serão utilizadas para se analisar este sinal.

4.1.1 Configuração “Clássica”

Aqui, uma configuração muito próxima do algoritmo proposto em [7] é utilizada para
se analisar o sinal. Os seguintes métodos foram alocados no MSS:

• mapeamento tempo-freqüência (time_freq_mapping) ⇒ stft;

• detecção de picos espectrais (peak_detection) ⇒ ct_max;

• rastreamento dos picos espectrais (partial_tracking) ⇒ mq.

Nenhum método opcional é utilizado nesta configuração. A configuração utilizada no MPS


da stft foi a seguinte:

window (janela): ‘hanning’


window_len (duraç~
ao da janela): 0.0200

71
fft_length (número de pontos da DFT): 2048
hop (salto entre janelas): 0.0050
zero_phase_flag (indica se o janelamento de fase zero deve ser utilizado): 1

Com isso, uma janela de Hann de comprimento de 20 ms é utilizada para a segmentação do


sinal. Além disso, o salto utilizado é de 5 ms e é realizado o janelamento com fase zero.
A etapa de detecção de picos, neste caso, não é crı́tica, pois não há ruı́do contaminando
o sinal. Assim, é utilizado o algoritmo que se referencia ao máximo do espectro para a escolha
do limiar. O MPS deste método é o seguinte:

threshold (limiar, dBs abaixo do valor máximo do espectro): -20,

ou seja, o limiar de um quadro se situa 20 dB abaixo do pico de valor máximo deste quadro.
Por último, restam os parâmetros do algoritmo de ligação dos picos espectrais, que
são:

max_freq_var (variaç~
ao máxima de freqü^
encia entre quadros): 3.5000
max_inactive_time (tempo em que a trilha pode ficar no estado inativa): 0.001
min_track_length (duraç~
ao mı́nima permitida para uma trilha): 0.0100

Com isso, a variação máxima permitida para a freqüência de uma trilha entre dois qua-
dros consecutivos é de 3,5%, o tempo máximo que uma trilha pode permanecer no estado
“dormindo” é de 10 ms (dois quadros) e a duração mı́nima que uma trilha deve ter é de
100 ms.
Utilizando esta configuração, as estimativas obtidas para A(t) e Φ(t) podem ser vistas
na Figura 4.2. Pode-se observar na figura que, devido à quantização da freqüência para os
centros das raias da DFT, diversas trilhas de curta duração são criadas no lugar de uma
trilha de longa duração. O comportamento da freqüência não é capturado e a modulação da
amplitude pode ser observada, mas com o valor escalado erroneamente. Além disso a modu-
lação em freqüência contamina a estimativa da amplitude devido à falta de um estimador de
amplitude sofisticado.

4.1.2 Configuração com Refinamentos

O primeiro refinamento utilizado é a reatribuição da freqüência. Para isto, o MSS do


método anterior foi alterado para:

72
φ(t)
460

freqüência (Hz) 450

440

430
0 0,5 1 1,5 2
A(t)
0,1
amplitude

0,05

0
0 0,5 1 1,5 2
tempo (s)

Figura 4.2: Parâmetros das trilhas obtidas a partir do sinal 1 – primeira configuração.

• mapeamento tempo-freqüência (time_freq_mapping) ⇒ stft;

• detecção de picos (peak_detection) ⇒ ct_max;

• estimação de freqüência instantânea (rf_slot1) ⇒ rf_freq_rea;

• rastreamento dos picos espectrais (partial_tracking) ⇒ mq.

Os parâmetros dos métodos são os mesmos que os utilizados no exemplo anterior, o método
rf_freq_rea não possui parâmetros.
O resultado deste teste pode ser visto na Figura 4.3. Neste caso, a utilização de
uma estimativa da freqüência instantânea permitiu que o algoritmo de ligação de trilhas
identificasse corretamente a única componente do sinal. Além disso, pode-se ver que a
estimativa gerada pelo método de reatribuição em freqüência é muito próxima da função
utilizada para se criar o sinal. O maior erro cometido é durante o inı́cio e o fim do sinal,
quando este possui um nı́vel de energia muito baixo.
Neste caso, a contaminação da estimativa da amplitude pela modulação em freqüência
fica ainda mais evidente que no exemplo anterior. Para ilustrar o efeito do estimador de
amplitude, este foi adicionado ao MSS, tendo-se ao final:

• mapeamento tempo-freqüência (time_freq_mapping) ⇒ stft;

• detecção de picos (peak_detection) ⇒ ct_max;

73
Φ’(t)
440

freqüência (Hz)
435

430
0 0,5 1 1,5 2
A(t)
0,1
amplitude

0,05

0
0 0,5 1 1,5 2
tempo (s)

Figura 4.3: Parâmetros das trilhas obtidas apartir do sinal sinal 1 – configuração utilizando
estimativa da freqüência instantânea.

• estimação de freqüência instantânea (rf_slot1) ⇒ rf_freq_rea;

• estimação de amplitude e fase (rf_slot2) ⇒ rf_amp_corr;

• rastreamento dos picos espectrais (partial_tracking) ⇒ mq.

Assim, o método de estimação de amplitude utilizará as estimativas da freqüência instantânea


obtidas no método anterior. Os parâmetros dos métodos são os mesmos que nos outros
métodos. Os parâmetros da trilha obtida com esta configuração podem ser observados na
Figura 4.4. Neste caso, as estimativas da modulação em amplitude e da modulação em
freqüência são muito próximas das utilizadas para se gerar o sinal.
Esta pequena demonstração do sistema teve como objetivo ilustrar como o usuário
pode configurar o sistema de diferentes maneiras de modo a melhorar a qualidade das trilhas
obtidas.

4.2 Sinais Reais


Este exemplo tenta demonstrar como a ligação dos picos espectrais é influenciada
pelos diferentes métodos de predição. Neste caso, optou-se por utilizar um sinal real para o
exemplo. O sinal escolhido foi uma nota de violino com um longo vibrato retirado de uma

74
Φ’(t)
450

freqüência (Hz)
445
440
435
430
0 0,5 1 1,5 2
A(t)
1
amplitude

0,5

0
0 0,5 1 1,5 2
tempo (s)

Figura 4.4: Parâmetros das trilhas obtidas a partir do sinal 1 – configuração utilizando
estimativas da freqüência instantânea e da amplitude.

gravação. A taxa de amostragem do sinal é de 44,1 kHz e o sinal foi quantizado em 16 bits
(qualidade de áudio de CD). A configuração do sistema foi a seguinte:

• mapeamento tempo-freqüência (time_freq_mapping) ⇒ stft;

• pré-processamento espectral (spp_slot1) ⇒ tpsw;

• detecção de picos (peak_detection) ⇒ ct_max;

• estimação de freqüência instantânea (rf_slot1) ⇒ rf_freq_rea;

• estimação de amplitude e fase (rf_slot2) ⇒ rf_amp_corr;

Os métodos stft e o ct_max foram configurados exatamente como no exemplo anterior. Os


parâmetros do método tpsw foram:

win_len (metade do número de amostras da janela): 50


win_gap (número de zeros no centro da janela): 8
sm_th (limiar de suavizaç~
ao): 4

O método de ligação de picos foi variado de modo que os quatro métodos apresentados
(MQ, Burg e os dois RLSs) fossem utilizados. A configuração escolhida para o método MQ
foi:

75
max_freq_var (variaç~
ao máxima de freqü^
encia entre quadros): 5
max_inactive_time (tempo em que a trilha pode ficar no estado inativa): 0.025
min_track_length (duraç~
ao mı́nima permitida para uma trilha): 0.1

Para o método utilizando predição pelo algoritmo de Burg (lp_burg), os parâmetros esco-
lhidos foram os mesmos dos escolhidos para o método MQ acrescidos de:

amp_pred_win (número de amostras na janela de prediç~


ao da amplitude): 20
freq_pred_win (número de amostras na janela de prediç~
ao da freqü^
encia): 20
amp_pred_len (número de coeficientes de prediç~
ao da amplitude): 4
freq_pred_len (número de coeficientes de prediç~
ao da freqü^
encia): 4

Para o rls simples (lp_rls), os parâmetros foram:

amp_pred_len (número de coeficientes de prediç~


ao da amplitude): 2
freq_pred_len (número de coeficientes de prediç~
ao da freqü^
encia): 4
amp_forg_factor (fator de esquecimento do preditor da amplitude): 0.98
freq_forg_factor (fator de esquecimento do preditor da freqü^
encia): 0.98
amp_init_factor (inicializaç~
ao do preditor da amplitude): 2000
freq_init_factor (inicializaç~
ao do preditor da freqü^
encia): 2000

E para o rls conjunto (lp_rls_joint):

pred_len (número de coeficientes de prediç~


ao): 4
forg_factor (fator de esquecimento): 0.98
init_factor (inicializaç~
ao): 2000

As trilhas obtidas variando-se os quatro métodos podem ser vistas nas Figuras 4.5, 4.6,
4.7 e 4.8. A faixa de freqüência de 7 a 15 kHz foi escolhida para facilitar a visualização das
trilhas. Pode-se observar nestas figuras que a predição conjunta da freqüência e da amplitude
utilizando o RLS obteve um resultado superior aos demais para a configuração adotada. Uma
análise mais profunda do desempenho destes métodos para este sinal e outros testes pode ser
encontrada em [68]. Neste exemplo, estamos mais interessados em demonstrar a facilidade
com que o sistema pôde gerar esta comparação, permitindo fácil reconfiguração, já que apenas
os métodos sob teste precisam ser configurados, aproveitando-se toda a configuração realizada
anteriormente.

76
x 104
1,5

1,4

1,3
Freqüência (Hz)

1,2

1,1

1,0

0,9

0,8

0,7
0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
Tempo (s)

Figura 4.5: Trilhas obtidas para um vibrato de violino utilizando o algoritmo MQ.

x 10 4
1,5

1,4

1,3
Freqüência (Hz)

1,2

1,1

1,0

0,9

0,8

0,7
0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
Tempo (s)

Figura 4.6: Trilhas obtidas para um vibrato de violino utilizando o algoritmo de Burg.

77
x 104
1,5

1,4

1,3
Freqüência (Hz)

1,2

1,1

1,0

0,9

0,8

0,7
0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
Tempo (s)

Figura 4.7: Trilhas obtidas para um vibrato de violino utilizando o algoritmo RLS sem
predição conjunta.

x 104
1,5

1,4

1,3
Freqüência (Hz)

1,2

1,1

1,0

0,9

0,8

0,7
0,3 0,4 0,5 0,6 0,7 0,8 0,9 1
Tempo (s)

Figura 4.8: Trilhas obtidas para um vibrato de violino utilizando o algoritmo RLS com
predição conjunta.

78
Capı́tulo 5

Conclusões

Este trabalho apresentou um sistema de análise senoidal flexı́vel e com um alto grau
de modularidade. Para isto, fez-se uma descrição teórica dos principais algoritmos de análise
senoidal buscando-se uma apresentação unificada. Esta descrição teórica, apesar de não ser
completa, por não apresentar todos os métodos publicados de análise senoidal, permitiu a
identificação dos blocos comuns aos algoritmos. Isto levou ao projeto de um sistema que
explorasse esta complementaridade, levando às estapas utilizadas no sistema.
Esta maneira de enxergar o sistema de análise senodal permitiu que novos algoritmos
pudessem ser utilizados nas etapas já existentes. Isto levou à publicação de dois artigos
([52] e [68]) apresentando e comparando novos métodos com outros anteriores. Além disso,
conforme algoritmos já existentes são “importados”para o sistema, a interação desses métodos
com os já implementados pode ser aferida. Isto só é possı́vel graças à grande modularidade
do sistema criado.
Como trabalhos futuros para a parte teórica, pode ser identificada a necessidade de
melhoria do operador de reatribuição de freqüência para o tempo discreto, já que o seu
desempenho é inferior aos demais devido à má aproximação da derivada da janela no tempo
discreto. Para a etapa de mapeamento tempo-freqüência, ainda resta a comparação dos
limites teóricos para a STFT com os requisistos para a análise de sinais musicais. Isto
pode levar à utilização de mapeamentos tempo-freqüência mais robustos ou a uma melhor
escolha dos parâmetros da SFTF. Na etapa de detecção de picos resta a necessidade de um
algoritmo automático de escolha do limiar, que não dependa tanto de parâmetros escolhidos
pelo usuário. Por fim, os algoritmos de ligação dos picos espectrais precisam ser comparados
de uma maneira mais robusta, o que leva à necessidade de um sistema que avalie a qualidade
das trilhas extraı́das.
A implementação do sistema, apesar de utilizar recursos pouco ortodoxos de progra-
mação, levou a um sistema que atende aos requisitos impostos. A flexibilidade tão desejada
foi alcançada e a adição de novos métodos ao sistema pode ser feita de maneira simples. Além
disso, os métodos já implementados permitem uma grande variedade de configurações e di-
ferentes caracterı́sticas. Com isso, o sistema desenvolvido pode ser utilizado como front-end
para sistemas de separação de fontes, transcrição automática e codificação de áudio.

80
Apêndice A

Requisitos

A.1 Introdução

A.1.1 Objetivo

Este documento tem como objetivo especificar os requisitos1 de um programa para


análise senoidal de sinais musicais para Matlab que servirá como projeto final do autor para o
curso de Engenharia Eletrônica e de Computação do Departamento de Engenharia Eletrônica
e de Computação da Escola Politécnica da Universidade Federal do Rio de Janeiro.
Este documento será utilizado pelo autor e pelo orientador responsável pelo projeto
no decorrer do desenvolvimento do programa; além disso, também servirá de referência para
futuras versões do programa.

A.1.2 Escopo

O programa a ser desenvolvido, Sinus, tem como objetivo a obtenção das trilhas
senoidais de sinais musicais. Para isto será utilizada a análise senoidal. A análise senoidal
pode ser dividida em três etapas: 1) mapeamento tempo-freqüência, 2) seleção dos picos
espectrais e 3) montagem das trilhas. Pode-se adicionar mais duas etapas auxiliares neste
processo, o que caracteriza um pré-processamento espectral, caso ocorra antes da busca dos
picos espectrais, ou um refinamento espectral, caso ocorra após a busca dos picos espectrais.
O programa deve ter como saı́da as trilhas senoidais de um arquivo de áudio fornecido
1
Este documento foi mantido em seu formato original por ser parte da documentação do sistema. Nem
tudo que foi implementado no sistema foi requisitado neste documento.
pelo usuário. O programa deverá permitir que estes arquivos sejam salvos em algum formato
conveniente e deve fornecer ferramentas para visualização das trilhas. Além disso, o programa
deve permitir que as trilhas sejam convertidas para um arquivo de áudio. O programa não
irá fornecer ferramentas para a manipulação das trilhas obtidas.
O objetivo final deste programa é o apoio à produção cientı́fica, ao permitir que
diferentes métodos sejam utilizados, habilitando o estudo da análise senoidal com diferentes
métodos e sob diferentes configurações. Além disso, como permite o teste de diferentes
configurações, o sistema serve de base para outros sistemas que irão utilizar a análise senoidal
não como atividade fim, mas como uma etapa do seu processamento.

A.1.3 Definições

Os termos utilizados pelo documento serão descritos nesta subseção.

Trilhas Senoidais – Trilhas Senoidais [8] são a representação computacional do modelo


senoidal de um sinal musical. O modelo senoidal consiste na parametrização do sinal
de entrada em um somatório de senóides moduladas em amplitude e em freqüência
(fase). Devido a isso esta representação será composta por um conjunto de trilhas,
cada trilha representando uma senóide modulada em amplitude e freqüência, contendo
as seguintes informações:

• Vetor contendo a freqüência (em Hz) instantânea ao longo do tempo.

• Vetor contendo a amplitude instantânea ao longo do tempo.

• Vetor contendo os tempos (em segundos) associados aos pontos do vetor de freqüên-
cia e amplitude.

• Valor da fase inicial.

Análise Senoidal – Conjunto de técnicas de processamento digital de sinais [29] que per-
mitem a obtenção do modelo senoidal [7] de um sinal. Pode ser dividida em três etapas:
1) mapeamento tempo-freqüência, 2) busca dos picos espectrais e 3) montagem das tri-
lhas senoidais. Neste sistema, duas outras etapas (opcionais) podem ser adicionadas
antes e/ou após a busca dos picos espectrais, a primeira seria o pré-processamento
espectral e a segunda o refinamento espectral.

82
Método de Análise Senoidal – Conjunto de algoritmos de processamento digital de si-
nais que têm como objetivo cumprir ou refinar uma das etapas da análise senoidal.

Mapeamento Tempo-Freqüência – Esta etapa transforma o sinal recebido (um vetor


contendo as amostras do sinal de áudio) em uma matriz contendo uma representação
freqüêncial (em forma de módulo e fase) do sinal ao longo do tempo.

Busca dos Picos Espectrais – Nesta etapa os picos espectrais correspondentes às compo-
nentes senoidais para os instantes de tempo analisados são selecionados. Como entrada
ela recebe o espectro calculado na etapa anterior (modificado ou não) e fornece na saı́da
os picos selecionados para cada instante de tempo.

Montagem das Trilhas Senoidais – Nesta etaoa os picos encontrados em cada instante
de tempo são ligados de modo a formar as trilhas senoidais. Esta etapa utiliza a
informação dos picos selecionados na etapa anterior, e das estimativas de amplitude,
freqüência e tempo (refinadas ou não) de cada pico selecionado para criar as trilhas
senoidas. Ela pode ser dividida em duas partes. Na primeira, com o conhecimento das
trilhas já existentes, são feitas predições sobre a evolução da amplitude e freqüência da
trilha. Na segunda, os valores preditos são comparados, através de heurı́sticas, com os
picos encontrados de modo a fornecer a melhor continuação possı́vel para uma trilha.

Pré-processamento Espectral – Esta etapa opcional tem como objetivo modificar a re-
presentação freqüêncial do sinal de forma a auxiliar a etapa de seleção dos picos espec-
trais.

Refinamentos Espectrais – Esta etapa opcional tem como objetivo refinar as estimativas
de amplitude, tempo e freqüência dos picos encontrados. Ela também pode reavaliar
se um pico encontrado anterirormente, retirando-o. Os métodos de refinamentos es-
pectrais podem ser classificados de 4 maneiras. Refinamentos freqüênciais, melhoram
uma primeira estimativa da freqüência. Refinamentos na amplitude, melhoram uma
primeira estimativa da amplitude. Refinamentos no tempo, melhoram a estimativa do
tempo em que cada parcial ocorreu. E por último, validação dos picos, que ajudam a
retirar picos selecionados erroneamente pela etapa anterior. Métodos pertencentes as
quatro classificações de refinamentos podem estar ativas durante a análise. No entanto,
a utilização de mais de um método dentro de uma mesma classificação irá depender

83
dos métodos escolhidos.

PCM – Pulse Code Modulation [72]. Tipo de modulação digital comumente utilizada em
áudio que associa para cada ponto amostrado um número fixo de bits para representá-
los.

Arquivo WAVE – Microsoft Wave File [73]. Formato de arquivo não comprimido comu-
mente utilizado em áudio.

Agora serão descritos os métodos de análise senoidal que serão implementados nesta
primeira versão do programa, juntamente com seus parâmetros.

1. Métodos para Mapeamento Tempo-Freqüência:

STFT– Short-Time Fourier Transform. A STFT [9] consiste em dividir o sinal em


quadros no tempo e calcular a transformada discreta de Fourier de cada quadro,
podendo ser utilizadas janelas de suavização no tempo ao se dividir o sinal. Seus
parâmetros são:

• Tamanho do quadro de análise. Deve ser um número ı́mpar.

• Vetor contendo a janela de suavização a ser utilizada. O comprimento do


vetor deve ser igual ao tamanho do quadro de análise.

• Comprimento da Transformada de Fourier a ser utilizada. Deverá ser uma


potência de dois.

• Número de amostras superpostas em quadros adjacentes.

2. Métodos para Busca dos Picos Espectrais:

AP – All Peaks. Este método seleciona todos os picos espectrais. Não possui parâ-
metros.

CT – Constant Threshold [8]. Seleciona todos os picos que estão abaixo de um deter-
minado limiar. Parâmetro:

• Valor em dB do limiar em relação ao valor máximo da entrada.

Métodos para Montagem das Trilhas Senoidais:

MQ – Algoritmo de McAulay & Quatieri [11]. Este algoritmo usa como estima-
tiva para continuação da trilha a estimativa de freqüência mais recente da

84
trilha. Como heurı́stica para decisão do melhor pico ele utiliza a distância
entre as estimativas de freqüências do pico e das trilhas. Seus parâmetros
são:

• Máxima variação permitida de freqüência (percentual).

• Tempo que uma trilha pode permanecer procurando uma continuação sem
encontrar um pico adequado (em segundos).

• Tempo de duração mı́nimo para uma trilha (em segundos).

Predição Linear I – [65]. Este algoritmo utiliza o método de Burg como pre-
dição para os valores de amplitude e freqüência da trilha. Como heurı́stica
ele primeiro utiliza o critério da distância em freqüência para selecionar picos
candidatos e depois utiliza a distância da estimativa da amplitude para esco-
lher a melhor continuação. Seus parâmetros são os mesmos que os do método
MQ adicionados de:

• Comprimento da janela de predição de amplitude (em amostras).

• Comprimento da janela de predição da freqüência (em amostras).

• Comprimento do preditor de amplitude (em amostras).

• Comprimento do preditor da freqüência (em amostras).

Predição Linear II – [68]. Este algoritmo utiliza um filtro adaptativo RLS


para estimar os futuros valores da freqüência e amplitude. Como heurı́stica ele
utiliza o critério da distância das estimativas de freqüência para encontrar os
candidatos e depois uma métrica conjunta utilizando a distância da amplitude
e da freqüência normalizadas para encontrar a melhor continuação para a
trilha. Seus parâmetros, além dos parâmetros do método MQ, são:

• Comprimento do preditor de amplitude (em amostras).

• Comprimento do preditor da freqüência (em amostras).

• Valor do fator de esquecimento λ.

• Valor do fator de inicialização Π.

Predição Linear III – [68]. Exatamente como o método anterior porém utiliza
uma estimativa conjunta da freqüência e amplitude. A única mudança nos pa-
râmetros é apenas necessária um comprimento do preditor. Seus parâmetros,
além dos parâmetros do método MQ, são:

85
• Comprimento do preditor (em amostras).
• Valor do fator de esquecimento λ.
• Valor do fator de inicialização Π.

Métodos para Pré-Processamento Espectral:

Pré-Branqueamento por Modelo AR de Baixa Ordem [16]. Este método


calcula um modelo auto-regressivo de baixa ordem e o utiliza para realizar
uma filtragem inversa no sinal. Parâmetro:
• Comprimento do modelo auto-regressivo.
TPSW – Two-Pass Split Window [56]. Este método estima o ruı́do de fundo do
sinal e depois o subtrai do espectro original. Seus parâmetros são:
• Tamanho da janela a ser aplicada (em amostras).
• Tamanho da lacuna da janela (em amostras).
• Limiar para a suavização do espectro (em dB).
Limiar Variável com Histerese – [45]. Este método calcula um limiar variá-
vel utilizando a informação dos picos e do limiar encontrados no instante de
tempo passado. Não recebe parâmetros na entrada.

Métodos para Refinamento Espectral:

DFT1 – [47] Método de refinamento da estimativa da freqüência. É necessário


o sinal no tempo para seu cálculo. Não possui parâmetros.
Método da Diferença de Fases [49] Método de refinamento da freqüência.
São necessários o sinal no tempo para seu cálculo e uma estimativa inicial da
freqüência. Parâmetro:
• Número de amostras que devem ser deslocadas.
Reatribuição da Freqüência – [44] Método de refinamento da freqüencia. São
necessários a janela de suavização utilizada e o sinal no tempo. Não possui
parâmetros.
Reatribuição do Tempo – [44] Método de refinamento do tempo. É necessário
a janela de suavização utilizada e o sinal no tempo. Não possui parâmetros.
Time Crop – [45] Método de validação dos picos selecionados. Utiliza o tempo
de ocorrência de cada pico. Deve ocorrer após a reatribuição dos tempos.
Parâmetro:

86
• Desvio temporal máximo permitido entre o instante atribuı́do e o instante
reatribuı́do (em segundos).

Correção de Amplitude – [34] Método de refinamento da amplitude. Neces-


sita da janela de suavização utilizada. Não possui parâmetros.

A.1.4 Referências

As referências podem ser vistas no final do documento.

A.2 Descrição Geral

A.2.1 Perspectiva do Produto

O programa a ser desenvolvido deverá ser executado no Matlab (versão 7.0 e posterior).
Ele utilizará as facilidades do Matlab sempre que possı́vel. Ele não deverá precisar de nenhum
componente que não esteja presente numa instalação completa do Matlab.

Interfaces com Outros Sistemas

O sistema necessita apenas do Matlab para funcionar, não havendo nenhuma outra
interface externa.

Interfaces com o Usuário

Haverá duas interfaces com o usuário. Uma consistirá da execução das funções na
linha de comando do Matlab e a outra deverá ser uma interface gráfica, também executada a
partir do Matlab. Em ambas versões as interfaces com o usuário deverão permitir a escolha de
qual método utilizar em cada etapa do processamento, bem como os parâmetros necessários
de cada método escolhido.
A interface na linha de comando deverá receber como entrada um arquivo de áu-
dio e a configuração do sistema (quais métodos utilizar e seus parâmetros) e fornecer na
saı́da as trilhas. Além disso, deverão ser fornecidas funções auxiliares para a visualização, o
armazenamento em arquivos e a sı́ntese das trilhas obtidas.
A interface gráfica deverá fornecer recursos para a escolha dos métodos a serem uti-
lizados e de seus parâmetros. O usuário poderá visualizar as trilhas obtidas na interface e

87
poderá salvá-las e/ou sintetizá-las.

Interfaces com Softwares

A única interface com outro software existente será com o Mathworks Matlab (versão
7.0 ou superior). Este software fornecerá a infra-estrutura necessária para a execução do
programa a ser desenvolvido, bem como fornecerá o ambiente de execução para o programa.

Restrições à Memória

O programa deve conseguir ser executado em um computador com 1GB de memória


RAM.

A.2.2 Funções do Produto

O programa terá como objetivo o desenvolvimento de um conjunto de rotinas de


Matlab para Análise Senoidal de Sinais de Áudio. A interface com o usuário deverá ser
feita através da linha de comando ou de uma interface gráfica. As etapas de processamento
envolvidas na obtenção das trilhas deverão ser flexı́veis, permitindo que diferentes métodos
sejam utilizados. O sistema deve gerar como saı́da as trilhas senoidais identificadas no sinal
de entrada. Estas trilhas deverão estar descritas de forma a permitir a utilização por outros
sistemas, visualização, ressı́ntese e armazenamento.

A.2.3 Caracterı́sticas do Usuário

O usuário final do programa a ser desenvolvido são pesquisadores e desenvolvedores


de sistemas de áudio que desejem testar diferentes métodos e configurações para um sistema
de análise senoidal de sinais musicais. Além disso, ele permite a utilização das trilhas geradas
em outros sistemas, o teste de novos métodos ou ajustes de seus parâmetros para necessidades
especı́ficas. Para isto é necessário que o programa seja de fácil utilização e que a configuração
possa ser feita de maneira rápida.

A.3 Requisitos
Nesta seção serão descritos os requisitos funcionais e não-funcionais do programa a
ser desenvolvido.

88
A.3.1 Requisitos Funcionais

1. O programa deve receber sinais de áudio PCM monocanal.

2. O programa deve ser capaz de receber como entrada vetores contendo as amostras de
um sinal de áudio e sua freqüencia de amostragem.

3. O programa deve fornecer uma interface em linha de comando para o usuário.

4. O programa deve fornecer uma interface gráfica para o usuário.

5. O programa deve ser capaz de ler arquivos WAVE na entrada.

6. O processamento deverá ser dividido nas três etapas seqüenciais já descritas neste
documento.

7. O programa deve permitir a utilização de métodos de refinamento espectral.

8. O programa deve permitir a utilização de métodos de pré-processamento espectral.

9. O usuário deverá ser capaz de escolher quais métodos utilizará em cada etapa.

10. Os seguintes métodos de mapeamento tempo-freqüência deverão estar disponı́veis:


STFT.

11. Os seguintes métodos de busca de picos espectrais deverão estar disponı́veis: AP, CT
e VT.

12. Os seguintes métodos de montagem das trilhas deverão estar disponı́veis: MQ e Pre-
dição Linear I, II e III.

13. Os seguintes métodos de pré-processamento espectral deverão estar disponı́veis: Pré-


Branqueamento por Modelo AR de Baixa Ordem, TPSW e Limiar Variável com His-
terese.

14. Os seguintes métodos de refinamento espectral deverão estar disponı́veis: DFT1, Mé-
todo da Diferença de Fase, Reatribuição da Freqüência, Reatribuição do Tempo, Time
Crop e Correção da Amplitude.

15. O usuário deverá ser capaz de escolher os parâmetros de cada método escolhido para
cada etapa do processamento.

89
16. O usuário deverá ser capaz de armazenar as trilhas em um arquivo binário sem com-
pressão.

17. O usuário deverá ser capaz de ler as trilhas armazenadas pelo programa.

18. O usuário deverá ser capaz de visualizar as trilhas geradas pelo programa.

19. O usuário deverá ser capaz de receberr as trilhas sintetizadas em um único arquivo de
áudio.

20. O usuário deverá ser capaz de armazenar uma configuração do sistema com os parâ-
metros escolhidos.

A.3.2 Requisistos Não-funcionais

1. O sistema não precisa rodar em tempo real.

2. O sinal de entrada pode possuir qualquer freqüência de amostragem.

3. O sistema deve permitir que sejam analisados sinais de até 10 minutos a uma freqüência
de amostragem de 44,1 kHz .

4. O tempo de processamento não deve ser superior a 10 vezes a duração do sinal de


entrada.

5. O programa deve facilitar a adição de novos métodos de análise.

6. O programa deve ser compatı́vel com a versão 7.0 ou superior do Matlab para Windows
e para Linux.

7. O programa deve oferecer ajuda ao usuário nas duas interfaces.

8. O programa deve possuir um manual de ajuda.

90
Appendix B

Sinus User Guide

B.1 Introduction
Sinus is a modular partial-tracking sinusoidal analysis system for Matlab1 that allows
a wide variety of configurations. This document shows how to install Sinus and then set-up
a system configuration that can be used to analyse an audio file. It will also demonstrate
how to use Sinus auxiliary functions to save, load, plot, and synthesize the analysed signal
and how to save and load system configurations.
The main Sinus objective is to obtain a sinusoidal model of a given audio input
(either a monochannel Wave file or a matlab vector). The obtained model, in the form of
the so-called tracks, contains a representation of each parameter of the sinusoidal model for
every component found as time, frequency, amplitude, and phase vectors stored in a Matlab
structure.

B.2 System Overview


Sinus is divided in three main processing steps and two auxiliary processing steps.
These steps follow the sequential order depicted in Figure B.1. The three main steps are ‘time-
frequency mapping’, ‘peak detection’, and ‘partial tracking’. The ‘spectral pre-processing’
and ‘refinements’ steps are optional. For each of these steps more than one method is
available so that the user can choose the most desirable one, given the signal. Thus the
system configuration depends on choosing which method takes place in each processing step
1
Matlab is a trademark of MathWorks, Inc.
and then defining the chosen methods parameters.

Time−Frequency Spectral Peak Partial


Mapping Pre−Processing Detection Refinements Tracking

Figure B.1: Sinus processing steps.

The three main steps are unique since there can be only one method attributed to
each step. More than one method can be attributed to each auxiliary step. Currently Sinus
allows 2 ‘spectral pre-processing’ methods and 6 ‘refinements’ methods to be chosen in a
single configuration. The user should verify the compatibility between the chosen methods
as Sinus has no control over them.
The system comes with several methods already implemented and some configuration
files filled in to allow a quick configuration of the system.

B.3 Installing
In order to install Sinus simply unpack the compressed folder in the desired installation
directory. It is recommended to add the chosen directory to the Matlab path, so that the
Sinus functions become easily accesible. Sinus main directory should contain the sinus()
function, this user guide and the following directories:

• system – this folder contains the system main functions and methods;

• gui – this folder contains the graphical user interface functions;

• templates – this folder contains some methods templates and some parameters to let
users easily setup their system;

• function – this folder contains auxiliary functions that can be used by the user.

B.4 The Parameters Structure

B.4.1 Overview

The parameters structure contains all the necessary data for the Sinus execution apart
from the input signal. It consists of a two-layer Matlab structure; the first layer structure

92
contains the processing steps and is called Main Sinus’ Structure (MSS), the second layer
fields are the chosen methods’ parameters stored in a structure called Method’s Parameters
Structure (MPS). A system configuration has one MSS that contains one MPS for each
processing step. The MSS has the following form:

time_freq_mapping: [1x1 struct]


spp_slot1: [1x1 struct]
spp_slot2: [1x1 struct]
peak_detection: [1x1 struct]
rf_slot1: [1x1 struct]
rf_slot2: [1x1 struct]
rf_slot3: [1x1 struct]
rf_slot4: [1x1 struct]
rf_slot5: [1x1 struct]
rf_slot6: [1x1 struct]
partial_tracking: [1x1 struct]
Fs: 0

In this structure each field is associated with one processing step and should store an MPS of
the corresponding method. The exception is the Fs field, which contains the sampling rate
of the input signal. An example of an MPS can be seen below.

name: ‘stft’
desc: ‘Short Time Fourier Transform’
window: ‘Smoothing window name.’
window_len: ‘Smoothing window length in seconds.’
fft_length: ‘Number of points to use on DFT.’
hop: ‘Hop between consecutive analysis frames, in seconds.’
zero_phase_flag: ‘1 if zero phase windowing is to be used.’

In this set of parameters, the field ‘name’ is mandatory, as it identifies the method to be
used by Sinus; the field ‘desc’ containing method description is optional. The MPS should
be provided by the method chosen, the user only has to fill in the appropriate parameters.
If an auxiliary processing step is to be disabled (i.e. perform no processing) the user can use
a special MPS that only has the field ‘name’ with value ‘none’.

93
B.4.2 Obtaining a Method Structure

This section demonstrates how to easily obtain the MSS and MPSs necessary for
configuring Sinus. Two Sinus auxiliary functions are used: sn_get_parameters() and
sn_list_methods(). The sn_list_methods() can be used to obtain a list of available
methods. With no input argument, this function prints on screen the name and description
associated to all available methods for every processing step. If an output argument is pro-
vided, the available methods’ names are returned as a cell array. Optionally, a processing
step can be given as a string in the input argument of the function. In this case only the
methods available for the given processing step are listed. Valid input strings are:

‘time frequency mapping’ or ‘tfmap’


‘spectral pre-processing’ or ‘spp’
‘peak detection’ or ‘pd’
‘refinements’ or ‘rf’
‘partial tracking’ or ‘tr’

After choosing the methods the user has to fill in the MPSs. To do that it first has to
obtain the MSS, using the sn_get_parameters() function. To obtain the MSS the user has
to call the function sn_get_parameters() with no input argument. The returned MSS has
all processing steps disabled so the user must assign an MPS to, at least, the ‘time-frequency
mapping’, ‘peak detection’ and ‘partial tracking’ processing steps.
To obtain an MPS, the user just has to pass the chosen method name as the in-
put argument for the sn_get_parameters() function that the MPS will be returned. The
methods parameters should be filled (except the ‘name’ and ‘desc’ fields) and passed to the
appropriate MSS field. This is done by attributing the MPS to the corresponding MSS field.
The necessary steps to obtain a working parameter structure are summarized below:

1. Obtain the MSS using sn_get_parameters().

2. Obtain a list of available methods for all processing steps by using sn_list_methods().
Or use sn_list_methods(‘processing_step’) to list the methods for a specific pro-
cessing step.

3. Choose the methods.

4. Obtain the chosen methods’ MPS using sn_get_parameters(‘method_name’).

94
5. Fill in the MPSs.

6. For each method attribute the MPS to the appropiate MSS field.

B.4.3 Saving and Loading Parameters

The MSS can be saved and loaded using sn_save_param() and sn_load_param().
To save the parameters structure use sn_save_param(param_struct,file_name); if the file
name does not have the appropriate extension (.param), then one is provided by the function.
A saved MSS can be loaded by using sn_load_param(file_name), again if the file extension
is not provided, then one is provided by the function.
A quick alternative to fill in the MSS is to use some of the pre-filled structures provided
with the Sinus interface. Just load the parameters and modify them as necessary.

B.5 The sinus() Function


The sinus() function is Sinus’ main interface with the user. It receives either a
vector containing the signal to be analysed or a Wave file along with the MSS, and returns
the tracks obtained. With no input arguments the sinus() function starts Sinus Graphical
User Interface, which will be presented in section B.7. The uses of the sinus() function are:

• sinus() – starts Sinus GUI;

• tracks = sinus(‘input_file.wav’,param) – analyses the Wave file;

• tracks = sinus(input_vector,param) – analyses the vector;

• sinus(‘input_file.wav’,param,‘GUI’) – starts the GUI with given input parame-


ters.

If an input vector is provided, the user should fill in the Fs (sampling frequency) field in the
Sinus main parameters structure. If a Wave file is provided, it is not necessary to fill in this
field.
The output tracks is a structure vector with the following fields:

• time – vector containing the analysed times for the track, in seconds;

• frequency – vector containing the measured frequency for the track, in Hertz;

95
• amplitude – vector containing the measured amplitude for the track;

• phase – vector containing the measured phase for the track, in radians.

In the next section some functions for handling the tracks structures are presented.

B.6 Saving, Loading, Plotting, and Synthesizing

B.6.1 Saving and Loading Tracks

Once obtained, the tracks can be saved using the function sn_save_tracks(). The
function receives as input arguments the obtained tracks and the file name; if the file name
doesn’t have the appropriate extension (.trk), then one is provided by the function.
Similarly the sn_load_tracks() allows the users to load a saved track from disk.
The file name should be provided as the function argument; if the file name doesn’t have an
appropriate extension, then one is provided by the function.

B.6.2 Plotting

Sinus provides a function to plot the obtained tracks: sn_plot(). There are several
options to plot the tracks; they are:

• sn_plot(tracks) – Plots all the tracks in the tracks structure, showing the frequency
and amplitude of the tracks as subplots.

• sn_plot(tracks,tracks_no) – Plots only the tracks specified in the tracks_no vector.


The tracks_no vector should contain valid indices to the structure vector. Frequency
and amplitude are plotted in subplots.

• sn_plot(tracks,[],config_string) or sn_plot(tracks,tracks_no,config_string)
– Plots either all tracks or specified tracks but showing only config_string values.
Config_string can be:

– ‘amplitude’ - plots specified tracks’ amplitude values.

– ‘frequency’ - plots specified tracks’ frequency values.

– ‘phase’ - plots specified tracks’ phase values.

96
B.6.3 Synthesizing

Although Sinus main focus is on analysis, it provides a function to synthesize the


obtained tracks into an audio file, so that the user can evaluate the extracted tracks’ quality.
The function sn_synthesis() receives as input arguments the tracks’ structure vector, a
sampling rate and, optionally, a file name. If a file name is provided, the method stores the
synthesized signal in a Wave file with the desired file name. If a file name is not provided, a
vector containing the signal is returned by the function.

B.7 The Graphical User Interface


The Sinus graphical user interface is a quick way to setup an MSS, analyse a Wave file
and visualize the tracks. The main interface window can be seen on Figure B.2, and can be
divided in three distinct sections: the parameters area, the control area and the plot area.

Figure B.2: Main graphical user interface window.

The parameters area located on the far right of the window allows the user to view
all of the available methods for each processing step. A method can be chosen for each

97
processing step by selecting it on the corresponding drop-down box. It also allows the user,
via the ‘edit’ button, to fill in the MPS through a separate window. A typical edit parameters
window can be seen in Figure B.3, where the method name and description appear at the
top of the window and the parameters are seen as editable fields. Once filled in, the user can
press the ‘save’ button to store the values or the ‘cancel’ button to dismiss all modifications.
The control area is located at the bottom of the screen and allows the user to perform
different tasks. It can be further divided into 5 sections. The first allows loading an audio file
to be analysed, saving a synthesized audio, saving and loading the selected MSS and saving
the tracks’ structure vector. The second allows the user to analyse the loaded signal with the
chosen parameters and then synthesize the tracks into an audio signal. Below this section are
the buttons that allow the user to play back the original and synthesized tracks, if a sound
card is configured in the user’s Matlab. The fourth section controls the plot area, allowing
the user to view the amplitude or the frequency of the original signal, the synthesized signal
and the tracks. It also allows the user to choose the tracks to plot by entering their number
separated by commas in the box named ‘Tracks No’. The last section shows the name of the
loaded file and whether the file has been analysed, synthesized, or both.

Figure B.3: Example of an ‘edit parameters’ window.

The plot area contains the axis for plotting the frequency or the amplitude values of
the original signal, the synthesized signal, or the chosen tracks.
In the GUI, a signal can be easily analysed by simply loading the signal through the
‘Load File’, then loading the MSS with the ‘Load Parameters’ button and then clicking in
the ‘Analyse’ button. Afterwards the user can modify the MSS and MPSs as desired, as well
as evaluate the generated tracks by listening and/or inspecting them visually. Later, the
working configuration can be saved along with the obtained model for the signal.

98
Bibliography

[1] Klapuri, A., Davy, M. (eds.), Signal Processing Methods for Music Transcription.
Springer, 2006.

[2] BOSI, M., GOLDBERG, R. E., Introduction to Audio Coding and Standards. Kluwer,
2003.

[3] GODSILL, S. J., RAYNER, P. J. W., Digital Audio Restoration. Springer, 1998.

[4] VIRTANEN, T., Sound Source Separation in Monaural Music Signals. Tese Ph.D., Tam-
pere University of Technology, Tampere, Finland, November 2006.

[5] ELLIS, D. W. P., ROSENTHAL, D. F., “Mid-Level Representations for Computational


Auditory Scene Analysis”. In: International Joint Conference on Artificial Intelligence,
Montreal, Canada, 1995.

[6] ESQUEF, P. A. A., BISCAINHO, L. W. P., “Spectral-Based Analysis and Synthesis


of Audio Signals”. In: Pérez-Meana, H. (ed.), Advances in Audio and Speech Signal
Processing: Technologies and Applications, chapter III, Hershey: Idea Group, pp. 56 –
92, 2007.

[7] MCAULAY, R. J., QUATIERI, T. F., “Speech Analsysis/Synthesis Based on a Sinu-


soidal Representation”, IEEE Transactions on Acoustics, Speech, and Signal Processing,
v. 34, n. 4, pp. 744–754, August 1986.

[8] SMITH III, J. O., SERRA, X., “PARSHL: An Analysis/Synthesis Program for Non-
Harmonic Sounds Based on a Sinusoidal Representation”. In: Proceedings of the Inter-
national Computer Music Conference, v. 76 (6), pp. 1738–1742, Champaign-Urbana,
USA, 1987.

[9] COHEN, L., Time Frequency Analysis: Theory and Applications. Prentice Hall, 1995.
[10] FLANAGAN, J. L., MEINHART, D. I. S., GOLDEN, R. M., et al., “Phase Vocoder”,
The Journal of the Acoustical Society of America, v. 38, n. 5, pp. 939–940, November
1965.

[11] SERRA, X., SMITH III, J. O., “Spectral Modeling Synthesis: A Sound Analy-
sis/Synthesis System based on Deterministic plus Stochastic Decomposition”, Computer
Music Journal, v. 14, n. 4, pp. 12–24, Winter 1990.

[12] GEORGE, E. B., SMITH, M. J. T., “Analysis-by-Synthesis/Overlap-Add Sinusoidal


Modeling Applied to the Analysis and Synthesis of Musical Tones”, Journal of the Audio
Engeneering Society, v. 40, n. 6, pp. 497–516, June 1992.

[13] GOODWIN, M. M., “Multiscale Overlap-and-Add Sinusoidal Modeling Using Matching


Pursuit and Refinements”. In: Proceedings of the 2001 IEEE Workshop on the Appli-
cations of Signal Processing to Audio and Acoustics (WASPAA01), pp. 207–210, New
Paltz, USA, October 2001.

[14] GEORGE, E. B., SMITH, M. J. T., “Speech Analysis/Synthesis and Modification Us-
ing an Analysis-by-Synthesis/Overlap-Add Sinusoidal Model”, IEEE Transactions on
Acoustics, Speech and Signal Processing, v. 5, n. 5, pp. 389–206, September 1997.

[15] ANDERSON, D. V., CLEMENTS, M. A., “Efficient Multi-resolution Sinusoidal Mod-


eling”. In: Proceedings of the Joint Meeting of the 4th World Multiconference on Sys-
temics, Cybernetics and Informatics (SCI2000) and the 6th International Conference
on Informatin Systems Analysis and Synthesis (ISAS2000), Orlando, USA, 2000.

[16] HAYES, M. H., Statistical Digital Signal Processing and Modeling. Wiley, 2001.

[17] ISO/IEC, Coding of Audio-Visual Objects - Part 3: Audio, Int. Std. 144963:2001, MPEG
4 (Audio Edition 2001), 2001.

[18] VERMA, T. S., MENG, T. H. Y., “Extending Spectral Modeling Synthesis with Tran-
sient Modeling Synthesis”, Computer Music Journal, v. 24, n. 2, pp. 47–59, Fall 2000.

[19] AMATRIAIN, X., ARUMI, P., GARCIA, D., “CLAM: A Framework for Efficient and
Rapid Development of Cross-platform Audio Applications”. In: Proceedings of ACM
Multimedia, v. 1, Santa Barbara, USA, October 2006.

100
[20] AMATRIAIN, X., “CLAM: A Framework for Audio and Music Application Develop-
ment”, IEEE Software, v. 34, n. 1, pp. 82–85, January/February 2007.

[21] SERRA, X., BONADA, J., HERRERA, P., et al., “Integrating Complementary Spectral
Models in the Design of a Musical Synthesizer”. In: Proceedings of the International
Computer Music Conference, Thessaloniki, Greece, September 1997.

[22] LOSCOS, A., RESINA, E., “SmsTools”, webpage, May 2007, http://iua-
share.upf.es/wikis/clam/index.php/SMSToolsDetails.

[23] LOSCOS, A., RESINA, E., “SmsPerformer: A Real-Time Synthesis Interface for SMS”.
In: Proceedings of the 1st COST-G6 Workshop on Digital Effects (DAFx), Barcelona,
Spain, November 1998.

[24] FITZ, K., HAKEN, L., “Lemur: A Bandwidth-Enhanced Sinusoidal Modeling System”,
The Journal of the Acoustical Society of Americ, v. 103, n. 5, pp. 2756–2757, May 1998.

[25] FITZ, K., “LORIS”, webpage, March 2007, http://www.cerlsoundgroup.org/Loris/.

[26] FITZ, K., The Reassigned Bandwidth-Enhanced Method of Additive Synthesis. Tese
Ph.D., Dept. of Electrical and Computer Engineering, University of Illinois at Urbana-
Champaign., Urbana-Champaign, USA, 1999.

[27] FLADRIN, P., Time-Frequency/Time-Scale Analysis. Academic Press, 1999.

[28] GOODWIN, M. M., Adaptive Signal Models: Theory, Algorithms, and Audio Applica-
tions. Tese Ph.D., University of Berkeley, 1997, Berkeley, USA, 1997.

[29] DINIZ, P. S. R., DA SILVA, E. A. B., NETTO, S. L., Digital Signal Processing: System
Analysis and Design. Cambridge, 2002.

[30] HARRIS, F. J., “On the Use of Windows for Harmonic Analysis with the Discrete Fourier
Transform”, Proceedings of the IEEE, v. 66, n. 1, pp. 51–83, January 1978.

[31] MASRI, P., Computer Music Modeling of Sound for Transformation and Synthesis of
Musical Signals. Tese Ph.D., University of Bristol, Bristol, UK, 1996.

[32] GOODWIN, M. M., “Multiresolution Sinusoidal Modeling Using Adaptive Segmenta-


tion”. In: Proceedings of the 1998 IEEE Conference on Acoustics, Speech, and Signal
Processing, v. 3, pp. 1525–1528, Washington, USA, May 1998.

101
[33] RODET, X., DEPALLE, P., “Spectral Envelopes and Inverse FFT Synthesis”. In: Pre-
sented at the 93rd AES Convention, San Franciso, USA, 1992.

[34] QUATIERI, T. F., MCAULAY, R. J., “Audio Signal Processing Based on Sinusoidal
Analysis and Synthesis”. In: Kahrs, M., Brandenburg, K. (eds.), Applications of Digital
Signal Processing to Audio and Acoustics, Kluwer, pp. 312–416, 1998.

[35] Zölzer, U. (ed.), DAFX: Digital Audio Effects. Wiley, 2002.

[36] MARCHAND, S., LAGRANGE, M., “On the Equivalence of Phase-Based Methods
for the Estimation of Instantaneous Frequency”. In: Proceedings of the 14th European
Conference on Signal Processing (EUSIPCO 2006), Florence, Italy, September 2006.

[37] LAGRANGE, M., MARCHAND, S., “Estimating the Instantaneous Frequency of Si-
nusoidal Components Using Phase-Based Methods”, Journal of the Audio Engeneering
Society, v. 55, n. 5, pp. 385 – 399, May 2007.

[38] HAINSWORTH, S. W., MACLEOD, M. D., “On Sinusoidal Parameter Estimation”. In:
Proceedings of the 6th International Conference on Digital Audio Effects (DAFx), pp.
151 – 156, London, UK, September 2003.

[39] BETSER, M., COLLEN, P., RICHARD, G., et al., “Review and Discussion on Classical
STFT-Based Frequency Estimators”. In: Presented at the 120th Convention of the Audio
Engeneering Society, n. preprint 6765, 2006.

[40] ABE, M., SMITH III, J. O., “Design Criteria for Simple Sinusoidal Parameter Estimation
based on Quadratic Interpolation of FFT Magnitude Peaks”. In: Presented at the117th
Convention of the Audio Engeneering Society, v. 58, pp. 104 – 117, San Franciso, USA,
October 2004.

[41] ROY, R., PAULRAJ, A., KAILATH, T., “ESPRIT—A Subspace Rotation Approach to
Estimation of Parameters of Cisoids in Noise”, IEEE Transactions on Acoustics, Speech,
and Signal Processing, v. 34, n. 5, pp. 1340 – 1342, October 1986.

[42] KODERA, K., GENDRIN, R., DE VILLEDARY, C., “Analysis of Time-Varying Signals
with Small BT Values”, IEEE Transactions on Acoustics, Speech, and Signal Processing,
v. 26, n. 1, pp. 64 – 78, February 1978.

102
[43] AUGER, F., FLADRIN, P., “Generalization of the Reassignment Method to All Bilinear
Time-Frequency and Time-Scale Representations”. In: Proceedings of the 1994 IEEE
International Conference on Acostics, Speech and Signal Processing, v. 4, pp. 317 – 320,
Adelaide, Australia, April 1994.

[44] AUGER, F., FLADRIN, P., “Improving the Readability of Time-Frequency and Time-
Scale Representations by the Reassignment Method”, IEEE Transactions on Signal Pro-
cessing, v. 43, n. 5, pp. 1068 – 1089, May 1995.

[45] FITZ, K., HAKEN, L., “On the Use of Time-Frequency Reassignment in Additive Sound
Modeling”, Journal of the Audio Engeneering Society, v. 50, n. 11, pp. 879–893, Novem-
ber 2002.

[46] MARCHAND, S., “Improving Spectral Analysis Precision with an Enhanced Phase
Vocoder using Signal Derivatives”. In: Proceedings of the 1st COST-G6 Workshop on
Digital Effects (DAFx), Barcelona, Spain, 1998.

[47] DESAINTE-CATHERINE, M., MARCHAND, S., “High Precision Fourier Analysis of


Sounds Using Signal Derivatives”, Journal of the Audio Engeneering Society, v. 48, n.
7/8, pp. 654–667, July/August 2000.

[48] BROWN, J. C., PUCKETTE, M. S., “A High Resolution Fundamental Frequency De-
termination Based on Phase Changes of the Fourier Transform”, Journal of the Acoustic
Society of America, v. 94, n. 2, pp. 662 – 667, August 1993.

[49] DAVID, P. A. M.-S., SZCZUPAK, J., “Refining the Digital Spectrum”. In: Proceedings
of the IEEE 39th Midwest Symposium on Circtuits and Systems, v. 2, pp. 767 – 770,
Ames, USA, August 1996.

[50] MASTER, A. S., LEE, K., “Explicit Onset Modeling of Sinusoids Using Time Reassig-
ment”. In: Proceedings of the 2005 IEEE International Conference on Acoustics, Speech
and Signal Processing, v. III, pp. 221 – 224, Philadelphia, USA, March 2005.

[51] ROEBEL, A., RODET, M. Z. X., “Signal Decomposition by Means of Classification


of Spectral Peaks”. In: Proceedings of the International Computer Music Conference,
Miami, USA, November 2004.

103
[52] NUNES, L. O., ESQUEF, P. A. A., BISCAINHO, L. W. P., “Evaluation of Threshold-
Based Algorithms for Detection of Spectral Peaks in Audio”. In: Anais do 5o Congresso
de Engenharia de Áudio, pp. 66 – 73, São Paulo, Brazil, May 2007.

[53] GREY, J. M., GORDON, J. W., “Perceptual Effects of the Spectral Modifications of
Musical Timbres”, Journal of the Acoustic Society of America, v. 61, n. 5, pp. 1493 –
1500, May 1978.

[54] RABINER, L. R., SCHAFER, R. W., “Digital Processing of Speech Signals”, Journal
of the Acoustic Society of America, v. 67, n. 4, pp. 1406 – 1407, April 1980.

[55] MAKHOUL, J., “Linear prediction: A tutorial review”, Proceedings of the IEEE, v. 63,
n. 4, pp. 561 – 580, April 1975.

[56] STRUZINSKI, W. A., LOWE, E. D., “A Performance Comparison of Four Noise Back-
ground Normalization Schemes Proposed for Signal Detection Systems”, Journal of the
Acoustic Society of America, v. 76, n. 6, pp. 1738 – 1742, December 1984.

[57] LAURENTI, N., POLI, G. D., “A Method for Spectrum Separation and Envelope Es-
timation of the Residual in Spectrum Modeling of Musical Sound”. In: Proceedings of
the 3rd COST-G6 on Audio Digital Effects Workshop (DAFx), Verona, Italy, December
2000.

[58] LAURENTI, N., DE POLI, G., “A Nonlinear Method for Stochastic Spectrum Estima-
tion in the Modeling of Musical Sounds”, IEEE Transactions on Acoustics, Speech and
Signal Processing, v. 2, n. 15, pp. 531 – 541, February 2007.

[59] MACLEOD, M. D., “Nonlinear Recursive Smoothing Filters and Their Use for Noise
Floor Estimation”, IEEE Eletronics Letters, v. 28, n. 21, pp. 1952 – 1953, October 1992.

[60] MACLEOD, M. D., “Performance Analysis of Simple Non-Linear Recursive Smoothing


Filters”. In: Proceedings of the IEEE Coloquium on Non-Linear Filters, v. 5, pp. 1 – 6,
London, UK, May 1994.

[61] DONOHO, D. L., Wavelet shrinkage and W.V.D.: a 10-minute tour, Report 416, De-
partment of Statistics, Stanford University, June 1993.

104
[62] DEPALLE, P., GARCIA, G., RODET, X., “Tracking of Partials for Additive Sound
Synthesis Using Hidden Markov Models”. In: Proceedings of the 1993 IEEE International
Conference on Acostics, Speech and Signal Processing, v. 1, pp. 225 – 228, Minneapolis,
USA, April 1993.

[63] LAGRANGE, M., TZANETAKIS, G., “Sound Source Tracking and Formation Using
Normalized Cuts”. In: Proceedings of the 2007 IEEE Conference on Acoustics, Speech,
and Signal Processing, v. I, pp. 61 – 64, Honolulu, USA, April 2007.

[64] LAGRANGE, M., MARCHAND, S., RASPAUD, M., et al., “Enhanced Partial Tracking
Using Linear Prediction”. In: Proc. of the 6th Int. Conference on Digital Audio Effects
(DAFx’03), v. I, London, UK, September 2003.

[65] LAGRANGE, M., MARCHAND, S., RAULT, J.-B., “Using Linear Prediction to En-
hance The Tracking of Partials”. In: Proceedings of the 2004 IEEE International Confer-
ence on Acoustics, Speech, and Signal Processing, v. 4, pp. 241 – 244, Montreal, Canada,
April 2004.

[66] HAYKIN, S., Adaptive Filter Theory. 4a. Edição. Prentice Hall, 2001.

[67] DINIZ, P. S. R., Adaptive Filtering. 2a. Edição. Kluwer, 2002.

[68] NUNES, L. O., MERCHED, R., BISCAINHO, L. W. P., “Recursive Least-Squares Esti-
mation of the Evolution of Partials in Sinusoidal Analysis”. In: Proceedings of the 2007
IEEE Conference on Acoustics, Speech, and Signal Processing, v. I, pp. 253–256, IEEE,
Honolulu, USA, April 2007.

[69] SAYED, A., Fundamentals of Adaptive Filtering. Wiley-IEEE, 2003.

[70] PRESS, W. H., TEUKOLSKY, S. A., VETTERLING, W. T., et al., Numerical Recipes.
3a. Edição. Cambridge, 2007.

[71] IEEE, IEEE Recommended Practice for Software Requirements Specifications, Technical
Norm IEEE Std 830-1998, Software Engineering Standards Committee of the IEEE
Computer Society, 1998.

[72] HAYKIN, S., Communication Systems. 4a. Edição. John Wiley and Sons (WIE), 2006.

105
[73] MICROSOFT, “Multiple Channel Audio Data and WAVE Files”, webpage,
http://www.microsoft.com/whdc/device/audio/multichaud.mspx.

106

Você também pode gostar