Processamento de Sinais de Vazamento de Tubulações em MATLAB

Sistemas de Processamento de Sinais para Detecção de Vazamentos em Oleodutos

A detecção de vazamentos em tubulações representa uma área crítica na engenharia industrial, exigindo a aplicação de técnicas sofisticadas de processamento de sinais. Este artigo apresenta uma estrutura abrangente para análise e identificação de vazamentos utilizando algoritmos implementados em MATLAB.

Arquitetura do Sistema de Detecção

O framework proposto utiliza uma abordagem modular que integra múltiplas técnicas de processamento de sinais para maximizar a precisão na detecção e localização de vazamentos.

classdef TubulacaoMonitor
    properties
        taxa_amostragem = 1000;        % Taxa de amostragem (Hz)
        comprimento = 1000;           % Comprimento do duto (m)
        velocidade_som = 343;         % Velocidade do som (m/s)
        localizacao_vazamento = 300;  % Posição estimada (m)
    end
    
    methods
        function obj = TubulacaoMonitor(tx, comp)
            if nargin > 0
                obj.taxa_amostragem = tx;
                obj.comprimento = comp;
            end
        end
    end
end

  1. Pré-processamento de Sinais

1.1 Filtragem e Redução de Ruído

O pré-processamento adequado é fundamental para extrair as características relevantes do sinal de vazamento amidst ruídos ambientais e interferências.

function sinal_filtrado = aplicar_filtros(sinal, taxa)
    % Filtragem passa-banda para preservar frequências características
    
    freq_corte_inf = 10;    % Frequência inferior (Hz)
    freq_corte_sup = 500;   % Frequência superior (Hz)
    
    [coeff_b, coeff_a] = butter(4, [freq_corte_inf, freq_corte_sup]/(taxa/2), 'bandpass');
    sinal_filtado = filtfilt(coeff_b, coeff_a, sinal);
    
    % Aplicação de wavelet denoising
    sinal_filtado = wdenoise(sinal_filtado, 5, ...
        'Wavelet', 'db4', 'DenoisingMethod', 'SURE');
    
    % Remoção de spikes através de filtro mediano
    sinal_filtado = medfilt1(sinal_filtado, 5);
end

1.2 Amplificação de Características

function sinal_amplificado = усиление_сигнала(sinal, taxa)
    % Amplificação adaptativa de características
    
    sinal_amplificado = sinal;
    
    % Técnica spectral subtraction para redução de ruído
    sinal_amplificado = spectral_subtraction(sinal_amplificado, taxa);
    
    % Análise de envelope para detecção de modulações
    [envolvente, ~] = envelope(sinal_amplificado, 50, 'peak');
    sinal_amplificado = sinal_amplificado .* envolvente;
end

  1. Análise no Domínio Temporal

2.1 Extração de Características Estatísticas

function caracteristicas = analisar_dominio_temporal(sinal)
    % Métricas estatísticas temporais
    
    caracteristicas.valor_rms = rms(sinal);                    % Valor eficaz
    caracteristicas.amplitude_pico = max(abs(sinal));          % Pico máximo
    caracteristicas.fator_crista = caracteristicas.amplitude_pico / caracteristicas.valor_rms;
    caracteristicas.curtose = kurtosis(sinal);                 % Curtose
    caracteristicas.assimetria = skewness(sinal);              % Assimetria
    caracteristicas.variancia = var(sinal);                    % Variância
    
    % Fator de impulso
    caracteristicas.fator_impulso = max(abs(sinal)) / mean(abs(sinal));
    
    % Fator de forma
    caracteristicas.fator_forma = caracteristicas.valor_rms / mean(abs(sinal));
end

2.2 Análise de Correlação Cruzada

[atraso, correlacao] = analisar_correlacao(sinal_a, sinal_b, taxa)
    % Análise de correlação cruzada para determinação de posição
    
    [correlacao, defasagens] = xcorr(sinal_a, sinal_b, 'coeff');
    [~, indice_max] = max(abs(correlacao));
    atraso = defasagens(indice_max) / taxa;  % Atraso temporal (segundos)
    
    % Visualização da função de correlação cruzada
    figure;
    plot(defasagens/taxa, correlacao);
    xlabel('Atraso Temporal (s)');
    ylabel('Coeficiente de Correlação');
    title('Análise de Correlação Cruzada');
    grid on;
end

  1. Análise no Domínio da Frequência

3.1 Análise Espectral de Potência

[carac_frequencia, densidade_espectral] = processar_frequencia(sinal, taxa)
    % Análise de densidade espectral de potência
    
    [densidade_espectral, espectro] = pwelch(sinal, hamming(512), 256, 1024, taxa);
    
    % Extração de características espectrais
    carac_frequencia.centroide = sum(espectro.*densidade_espectral) / sum(densidade_espectral);
    carac_frequencia.freq_rms = sqrt(sum((espectro.^2).*densidade_espectral) / sum(densidade_espectral));
    
    % Proporção de energia em bandas de frequência
    banda_baixa = espectro <= 100;
    banda_media = (espectro > 100) & (espectro <= 300);
    banda_alta = espectro > 300;
    
    carac_frequencia.energia_baixa = sum(densidade_espectral(banda_baixa)) / sum(densidade_espectral);
    carac_frequencia.energia_media = sum(densidade_espectral(banda_media)) / sum(densidade_espectral);
    carac_frequencia.energia_alta = sum(densidade_espectral(banda_alta)) / sum(densidade_espectral);
    
    % Visualização do espectro
    figure;
    subplot(2,1,1);
    plot(espectro, 10*log10(densidade_espectral));
    xlabel('Frequência (Hz)');
    ylabel('Densidade Espectral (dB/Hz)');
    title('Análise Espectral de Potência');
    grid on;
end

3.2 Extração de Características por Bandas

function carac_banda = extrair_bandas_frequencia(sinal, taxa)
    % Decomposição em pacotes de wavelet - análise multirresolução
    
    nivel_decomposicao = 4;
    estrutura_wpt = wpdec(sinal, nivel_decomposicao, 'db4');
    
    % Extração de energia de cada nó
    carac_banda = zeros(1, 2^nivel_decomposicao);
    for idx = 0:2^nivel_decomposicao-1
        componentes = wprcoef(estrutura_wpt, [nivel_decomposicao, idx]);
        carac_banda(idx+1) = sum(componentes.^2);
    end
    
    % Normalização energética
    carac_banda = carac_banda / sum(carac_banda);
end

  1. Análise Tempo-Frequência

4.1 Transformada de Fourier de Curto Termo

[matriz_stft, vetor_frequencia, vetor_tempo] = analisar_stft(sinal, taxa, dim_janela)
    % Transformada de Fourier de Curto Prazo
    
    if nargin < 3
        dim_janela = 256;
    end
    
    janela = hamming(dim_janela);
    sobreposicao = round(0.75 * dim_janela);
    pontos_fft = 1024;
    
    [matriz_stft, vetor_frequencia, vetor_tempo] = spectrogram(sinal, janela, sobreposicao, pontos_fft, taxa);
    
    % Representação visual
    figure;
    imagesc(vetor_tempo, vetor_frequencia, 10*log10(abs(matriz_stft)));
    axis xy;
    xlabel('Tempo (s)');
    ylabel('Frequência (Hz)');
    title('Análise STFT Tempo-Frequência');
    colorbar;
end

4.2 Análise por Transformada Wavelet

[matriz_cwt, escalas] = processar_wavelet(sinal, taxa)
    % Transformada contínua wavelet
    
    escalas = 1:0.5:500;  % Range de frequências analisadas
    matriz_cwt = cwt(sinal, escalas, 'amor', taxa);
    
    % Energia wavelet
    energia_wavelet = abs(matriz_cwt).^2;
    
    % Visualização
    figure;
    imagesc((1:length(sinal))/taxa, escalas, 10*log10(energia_wavelet));
    axis xy;
    xlabel('Tempo (s)');
    ylabel('Escala');
    title('Análise Wavelet Tempo-Frequência');
    colorbar;
end

  1. Algoritmos de Detecção e Localização

5.1 Método de Onda de Pressão Negativa

function posicao_vazamento = localizar_onda_pressao(posicoes_sensores, atrasos, velocidade)
    % Localização por onda de pressão negativa
    
    num_sensores = length(posicoes_sensores);
    
    if num_sensores == 2
        % Localização com dois sensores
        distancia = posicoes_sensores(2) - posicoes_sensores(1);
        posicao_vazamento = posicoes_sensores(1) + ...
            (distancia + velocidade * atrasos) / 2;
        
    else
        % Localização por mínimos quadrados com múltiplos sensores
        matriz_A = [];
        vetor_b = [];
        
        for i = 2:num_sensores
            matriz_A(i-1, :) = [2*(posicoes_sensores(i) - posicoes_sensores(1)), ...
                         2*velocidade*(atrasos(i) - atrasos(1))];
            vetor_b(i-1) = posicoes_sensores(i)^2 - posicoes_sensores(1)^2 + ...
                     (velocidade*atrasos(1))^2 - (velocidade*atrasos(i))^2;
        end
        
        solucao = matriz_A \ vetor_b';
        posicao_vazamento = solucao(1);
    end
end

5.2 Detecção por Emissão Acústica

[existe_vazamento,confianca] = detectar_emissao_acustica(sinal, taxa, limiar)
    % Detecção de vazamento por emissão acústica
    
    % Extração de características
    atributos = extrair_features_vazamento(sinal, taxa);
    
    % Avaliação multifatorial
    pontuacao_energia = atributos.energia > limiar.energia;
    pontuacao_frequencia = atributos.proporcao_alta_frequencia > limiar.frequencia;
    pontuacao_correlacao = atributos.correlacao > limiar.corr;
    
    % Cálculo de confiança
    confianca = 0.4 * pontuacao_energia + 0.3 * pontuacao_frequencia + 0.3 * pontuacao_correlacao;
    existe_vazamento = confianca > 0.6;
end

  1. Abordagem por Aprendizado de Máquina

6.1 Extração de Features Consolidadas

function vetor_features = extrair_features_completas(sinal, taxa)
    % Extração abrangente de características
    
    % Características temporais
    atributos_tempo = analisar_dominio_temporal(sinal);
    
    % Características frequenciais  
    [atributos_frequencia, ~] = processar_frequencia(sinal, taxa);
    
    % Características tempo-frequência
    atributos_banda = extrair_bandas_frequencia(sinal, taxa);
    
    % Combinação em vetor único
    vetor_features = [...
        atributos_tempo.valor_rms, atributos_tempo.amplitude_pico, atributos_tempo.curtose, ...
        atributos_frequencia.centroide, atributos_frequencia.freq_rms, ...
        atributos_frequencia.energia_baixa, atributos_frequencia.energia_alta, ...
        atributos_banda];
end

6.2 Classificador SVM

function modelo_svm = treinar_classificador(dados_treinamento, rotulos)
    % Treinamento de classificador SVM para vazamentos
    
    % Normalização dos dados
    [dados_norm, media, desvio] = zscore(dados_treinamento);
    
    % Treinamento SVM
    modelo_svm = fitcsvm(dados_norm, rotulos, ...
        'KernelFunction', 'rbf', ...
        'BoxConstraint', 1, ...
        'KernelScale', 'auto', ...
        'Standardize', true);
    
    % Armazenamento de parâmetros de normalização
    modelo_svm.media = media;
    modelo_svm.desvio = desvio;
end

  1. Sistema Integrado de Detecção

function executar_sistema_deteccao()
    % Sistema completo de detecção de vazamentos
    
    % Configuração de parâmetros
    taxa = 1000;
    comprimento_duto = 1000;
    posicoes_sensores = [100, 500, 900];
    
    % 1. Aquisição de dados
    dados_sensores = coletar_dados_sensores(posicoes_sensores);
    
    % 2. Pré-processamento
    sinais_processados = cell(size(dados_sensores));
    for idx = 1:length(dados_sensores)
        sinais_processados{idx} = aplicar_filtros(dados_sensores{idx}, taxa);
    end
    
    % 3. Extração de características
    atributos = [];
    for idx = 1:length(sinais_processados)
        feat = extrair_features_completas(sinais_processados{idx}, taxa);
        atributos = [atributos; feat];
    end
    
    % 4. Detecção de vazamento
    [existe_vazamento, confianca] = identificar_vazamento(atributos);
    
    if existe_vazamento
        % 5. Localização do vazamento
        atrasos = calcular_atrasos(sinais_processados, taxa);
        posicao_vazamento = determinar_localizacao(posicoes_sensores, atrasos);
        
        fprintf('Vazamento detectado! Posição: %.2f metros, Confiança: %.2f\n', ...
            posicao_vazamento, confianca);
    else
        fprintf('Sistema operacional - nenhum vazamento detectado\n');
    end
    
    % 6. Visualização dos resultados
    apresentar_resultados(sinais_processados, atributos, existe_vazamento, posicao_vazamento);
end

Resumo de Algoritmos-Chave

Categoria Algoritmo Principal Aplicação Vantagens
Análise Tmeporal Estatísticas, Correlação Detecção rápida, Triagem Baixa complexidade computacional
Análise Espectral PSD, Energia por banda Identificação de padrões Resistência a ruídos
Análise Tempo-Freq STFT, Wavelet Sinais não-estacionários Representação jointly temporoespacial
Localização Onda de pressão, Emissão acústica Posicionamento preciso Alta precisão locacional
Inteligência Artificial SVM, Redes neurais Análise complexa Alta adaptabilidade

Tags: MATLAB signal-processing pipeline-detection wavelet-transform STFT

Publicado em 6-20 20:14