UNPKG

@sophialabs/spectro

Version:

lib para geração de espectrogramas

186 lines (185 loc) 7.17 kB
export * from './colormaps.js'; /** * Parâmetros da lib */ export interface SpectrogramParams { sampleRate?: number; scaleType?: 'Linear' | 'Mel'; fMin?: number; fMax?: number; fftSize?: number; windowType?: 'None' | 'Cosine' | 'Hanning' | 'BH7'; colormapName?: string; canvasHeight?: number; nTicks?: number; gainDb?: number; rangeDb?: number; targetWidth?: number; showFrequencyAxis?: boolean; showTimeAxis?: boolean; timeTickMinPx?: number; hopSize?: number; } export declare class SpectrogramGenerator { private params; /** * Cria uma instância do gerador de espectrograma. * @param options Parâmetros de configuração; valores omitidos usam defaults. */ constructor(options?: SpectrogramParams); /** * Gera o espectrograma a partir de um vetor mono (Float32Array) e retorna um canvas. * - Respeita `scaleType` (Linear/Mel) no mapeamento vertical. * - Aplica margens apenas quando eixos são exibidos. * - Ajusta altura para `canvasHeight` e largura para `targetWidth` (ou window.innerWidth). * @param audioData Amostras de áudio mono. * @returns HTMLCanvasElement com o espectrograma renderizado. */ generateSpectrogram(audioData: Float32Array): HTMLCanvasElement; /** * Exporta o espectrograma como PNG em alta resolução (retorna DataURL). * @param audioData Dados de áudio (mesmo usado no generateSpectrogram). * @param upscale Fator de escala para aumentar a resolução (default: 2). * @returns DataURL "image/png". */ exportHighResPNG(audioData: Float32Array, upscale?: number): string; /** * Calcula o espectrograma (magnitude em dB) frame a frame. * @param audioData Sinal de entrada (após filtragem). * @param fftSize Tamanho da FFT. * @param windowType Tipo de janela. * @param hopSize Passo entre frames (amostras). * @returns Matriz [frame][bin] com magnitudes em dB (0..Nyquist). */ private computeSpectrogram; /** * Cria um canvas offscreen com o espectrograma colorido e mapeado (Linear/Mel). * - Normalização por faixa dinâmica (ancorada no pico global). * - Calcula a duração total (em segundos) para o eixo de tempo. * @returns Objeto com canvas offscreen e metadados: { offscreenCanvas, specWidth, specHeight, globalMax, totalDurationSec } */ private createOffscreenCanvas; /** * Desenha o eixo de frequências (Linear/Mel) à esquerda. * @param ctx Contexto 2D do canvas final. * @param scaleType 'Linear' ou 'Mel'. * @param fMin Frequência mínima (Hz). * @param fMax Frequência máxima (Hz). * @param top Topo da área útil. * @param height Altura da área útil. * @param leftMargin Largura da margem esquerda. * @param nTicks Número de divisões (ticks). */ private drawFrequencyAxis; /** * Desenha o eixo de tempo (s) na base do gráfico. * @param ctx Contexto 2D. * @param durationSec Duração total do áudio representado (s). * @param left Posição X do início do conteúdo. * @param top Posição Y do topo do conteúdo. * @param width Largura do conteúdo. * @param height Altura do conteúdo. * @param bottomMargin Tamanho da margem inferior disponível para labels. * @param minPx Espaço mínimo entre marcas (px). */ private drawTimeAxis; /** * Calcula um passo "agradável" de tempo para o eixo, * respeitando um espaçamento mínimo em pixels. * @param totalSec Duração total (s). * @param widthPx Largura em pixels. * @param minPx Espaçamento mínimo entre ticks (px). * @returns Passo em segundos. */ private getNiceTimeStep; /** * Formata rótulos de tempo: "ms/s/mm:ss/hh:mm:ss" * @param sec Segundos. * @returns String formatada. */ private formatTimeLabel; /** * FFT recursiva (radix-2). Requer tamanho potência de 2. * @param signal Sinal de entrada (janela já aplicada). * @returns Array de {re, im}. */ private myFFT; /** * Aplica janela ao frame conforme `windowType`. * @param signal Frame de entrada. * @param windowType Tipo de janela. * @returns Frame janelado (ou o próprio se None/default). */ private applyWindow; /** * Converte Hz -> Mel (escala de tons perceptual). * @param f Frequência em Hz. */ private freqToMel; /** * Converte Mel -> Hz. * @param m Valor em Mel. */ private melToFreq; /** * Gera ticks de frequência (Linear ou Mel) entre f_min e f_max. * @param f_min Hz mínimo. * @param f_max Hz máximo. * @param scaleType 'Linear' ou 'Mel'. * @param nTicks quantidade de divisões (mín. 2). * @returns Array de frequências para rotular o eixo. */ private generateDynamicFreqTicks; /** * Resolve a cor [r,g,b] (0..255) para um valor normalizado [0..1]. * Espera uma função colormap no escopo global: `window[colormapName](t)`. * @param value Valor normalizado (0..1). * @param colormapName Nome do colormap (ex.: 'hot'). * @returns Array [r,g,b]. */ private getColormapValue; /** * Aplica filtragem FIR conforme parâmetros opcionais em this.params: * - filterType: 'none' | 'lowpass' | 'highpass' | 'bandpass' | 'notch' * - filterCutoffs: [cutoff] ou [lowCut, highCut] (Hz) * Observação: parâmetros não estão tipados no SpectrogramParams desta versão, * logo é feito cast para `any` aqui. * @param signal Sinal de entrada. * @returns Sinal filtrado (ou original, se não configurado). */ private applyFilter; /** * Kernel FIR passa-baixa (windowed-sinc + Hamming). * @param cutoff Hz de corte. * @param sampleRate Hz. * @param kernelSize Tamanho ímpar do kernel. * @returns Coeficientes FIR. */ private generateLowpassKernel; /** * Kernel FIR passa-alta = delta - lowpass(cutoff). * @param cutoff Hz de corte. * @param sampleRate Hz. * @param kernelSize Tamanho ímpar do kernel. * @returns Coeficientes FIR. */ private generateHighpassKernel; /** * Kernel FIR passa-banda = lowpass(highCut) - lowpass(lowCut). * @param lowCut Hz de corte inferior. * @param highCut Hz de corte superior. * @param sampleRate Hz. * @param kernelSize Tamanho ímpar do kernel. * @returns Coeficientes FIR. */ private generateBandpassKernel; /** * Kernel FIR rejeita-banda (notch) = delta - bandpass(lowCut, highCut). * @param lowCut Hz de corte inferior da banda rejeitada. * @param highCut Hz de corte superior da banda rejeitada. * @param sampleRate Hz. * @param kernelSize Tamanho ímpar do kernel. * @returns Coeficientes FIR. */ private generateNotchKernel; }