INHOUDSOPGAWE:

Sistema Autônomo Localizador De Vazamentos: 11 stappe
Sistema Autônomo Localizador De Vazamentos: 11 stappe

Video: Sistema Autônomo Localizador De Vazamentos: 11 stappe

Video: Sistema Autônomo Localizador De Vazamentos: 11 stappe
Video: galinh4 2024, November
Anonim
Sistema Autônomo Localizador De Vazamentos
Sistema Autônomo Localizador De Vazamentos

Este projeto consiste em um robô, que através da leitura realizada por um dispositivo, equipado com um sensor piezoelétrico, captura os espectros das vibrações no solo, pode identificar e localizar, com of processamento dos dados por uma rede neurale, possíveis vazamentos de água uma tubulação.

U kan die algoritme vir DRAGONBOARD 410c installeer. Ons kan ook hierdie funksies vir u nuut bedien, en u kan ook 'n kunsmatige taak verwerk.

Este projeto foi desenvolvido no Hackaton Qualcomm, durante a TecnoFACENS da Faculdade de Engenharia de Sorocaba (FACENS), participaram do projeto os graduandos de engenharia mecatrônica Eneo Juliano Bovino, Felipe Xavier, Lucas de Sousa Rodrigues, Rogério. Gomes Polo en Ronaldo P. Gomes Polo. Também participou do projeto o aluno Daniel de Castro Pacheco graduando de engenharia mecânica by Universidade Newton Paiva de Belo Horizonte. O projeto contou com o apoio dos graduandos de engenharia mecatrônica da FACENS, Lucas Nunes Monteiro en Felipe Crispim da Silva Salvagnini.

Stap 1: Lista De Materiais

Lista De Materiais
Lista De Materiais

Para realização deste projeto, os seguintes materiais foram utilizados:

1 Arduino Due

1 Dragonboard 410c

2 Bestuurders vir die voortgesette kontant van die motor:

4 Transistore BC548

4 Diodos 1n4007

4 Weerstand 4k7Ω ¼ W

1 Bestuurder vir die servomotor:

1 Transistore BC548

1 Diodos 1N4007

1 Weerstaan 4k7Ω ¼ W

1 USB -muis

1 Teclado USB

1 Monitor

1 Cabo HDMI

1 Robô De Esteiras - Plataforma Zumo

1 Mini dispositivo de cremalheira en engrenagem

1 servomotor 9g

Stap 2: Adaptação Mecânica

Image
Image

Para a aquisição dos dad pelo sensor piezoelétrico, faz se necessário, o desenvolvimento de um dispositivo com pinhão e cremalheira, conforme desenhos anexados, next caso as peças foram fabricadas por uma impressora 3D, devido ao fato de se tratar de um protto tempo de execução, fixou-se of dispositivo na plataforma zumo, utilizando fita dupla face, conforme vídeo.

Stap 3: Acionamento Dos Motores

Obtenção Do Áudio
Obtenção Do Áudio

Para executar a movimentação dos motores to robô ZUMO e do dispositivo de captura, fez-se needsária a montagem de dois drivers for os motores de corrente continua e um driver para o servo motor, conforme as figuras acima, stuur 'n primeira figuur of bestuurder para um motor de corrente continua ea segunda o driver para um servo motor.

Stap 4: Obtenção Do Áudio

Para obtenção do espectro de áudio das vibrações do solo, foi utilizado um dispositivo desenvolvido como parte do TCC de Engenharia Mecatrônica dos graduandos Lucas Nunes Monteiro e Felipe C. da Silva Salvagnini, meer besonderhede so TCO en sobre o dispositivo e -pos [email protected].

Este dispositivo utiliza-se de um sensor piezoelétrico e uma placa de circuito que realiza a filteragem and amplificação do sinal.

As frekwensies van belangstelling vir 'n projeto estão entre 100Hz e 800Hz. Para isso o dispositivo de sensoriamento foi configurado com uma frequência de amostragem de 3 kHz para que sejam respeitada as condições do teorema de amostragem de Nyquist, onde a frequência de aquisição deve estar esto pelo menos duas vezes acima das frequênias

A aquisição é habilitada e desabilitada através da interrupção do Arduino DUE.

Stap 5: Configuração Do Arduino DUE (taal C)

Configuração Do Arduino DUE (taal C)
Configuração Do Arduino DUE (taal C)

Ons kan 'n groot kwantiteit van drie tot driehonderd pontos vir 32 -bits gebruik, sowel as 'n sensoriese sensor vir die algoritme van DRAGONBOARD 410c, of gebruik van Arduino DUE vir 'n digitale analise. poder de processamento, isso foi needsário por que Shield de interfaceamento Grove Seeed Sensor Mezzanine installed on DRAGONBOARD 410c, que possui um microcontrolador ATmega 328, no possui poder de processamento for essa operção.

O Arduino DUE foi configurado for receber os comandos enviados da plataforma QUALCOMM DRAGONBOARD 410c via comunicação serial.

As ações configuradas no Arduino foram:

Realizar a aquisição dos dados;

Transmitir os dados obtidos para a DRAGONBOARD 410c;

Skep 'n program:

#sluit in #definieer Numb_Sample 3000 #definieer DAC_Input A0

#definieer SERVO 7

#define PosServoMin 4 #define PosServoMax 6 #define Period 60 unsigned int Scont = 0, SNow = PosServoMin; ongetekende lang int DAC [Numb_Sample], ind = Numb_Sample; ongeldig TC3_Handler () {TC_GetStatus (TC1, 0); as (ind <Numb_Sample) DAC [ind ++] = analogRead (DAC_Input); indien (Scont

1); // 50% dienssiklus

TC_SetRC (tc, kanaal, rc); TC_Start (tc, kanaal); tc-> TC_CHANNEL [kanaal]. TC_IER = TC_IER_CPCS | TC_IER_CPAS; // habilita os registradores tc-> TC_CHANNEL [channel]. TC_IDR = ~ (TC_IER_CPCS | TC_IER_CPAS); // desabilita os registradores NVIC_EnableIRQ (irq); // habilita interrupção}

leemte opstelling ()

{Serial.begin (115200); pinMode (DAC_Input, INPUT); TimerStart (TC1, 0, TC3_IRQn, 1500); // Begin die Timer // TC_Stop (TC1, 0); pinMode (SERVO, UITPUT); }

leemte lus ()

{/*// terwyl (! Serial.available ()); char rc; // = Serial.read (); int indeks = 0; if (rc == 0) {terwyl (! Serial.available ()); rc = Serial.read (); skakelaar (rc) {geval 1: indeks = 0; terwyl (! Serial.available ()); terwyl ((rc = Serial.read ())! = 0xFF) {indeks << = 8; indeks += rc; terwyl (! Serial.available ()); } Serial.print (0); Reeks.afdruk (2); SendNumber (DAC [indeks]); Serial.print (0xFF); breek; saak 3: terwyl (! Serial.available ()); as ((Serial.read ()) == 0xFF) {SNOW = PosServoMax; vertraging (500); ind = 0; // TC_Start (TC1, 0); terwyl (ind <Numb_Sample); // TC_Stop (TC1, 0); Sneeu = PosServoMin; vertraging (500); Serial.print (0); Reeks.afdruk (4); Serial.print (0xFF); } breek; }} anders as (rc == '2') {Serial.print ("Toets servomotor / n"); terwyl (! Serial.available ()); rc = Serial.read (); if (rc == '1') {Serial.print ("Mode 1 / n"); Sneeu = PosServoMax; } if (rc == '2') {Serial.print ("Mode 2 / n"); Sneeu = PosServoMin; }} */ SNOW = PosServoMax; vertraging (100); Sneeu = PosServoMin; vertraging (100); }

Stap 6: Interfaceamento Das Tecnologias

Interfaceamento Das Tecnologias
Interfaceamento Das Tecnologias

Para a comunicação dos dados entre o Arduíno DUE ea DRAGONBOARD 410c, inicialmente utiliz-se a interface da figura acima, o que não foi possivel executor, então optou-se pelo uso and uma interface USB CDC entre of Arduino DUE ea DRAGONBOARD, needsitaria da recompilação do KERNEL da DRAGONBOARD 410c, wat ook nie die oorsaak van die tempo kan wees nie.

Stap 7: Configuração Da DRAGONBOARD 410c (Python)

Configuração Da DRAGONBOARD 410c (Python)
Configuração Da DRAGONBOARD 410c (Python)

Ons kan dit ook vir Arduino DUE gebruik, en ons kan dit vir 'n goeie tyd stuur. Skep 'n goeie idee.

Waarneming: 'n Abordagemem utilizada no código, não funcionou devido aos níveis de tensão utilizados pelo Arduíno DUE e o Mezzanine serem incompatíveis. Ons kan ook 'n USB-koppelvlak gebruik, wat KERNEL vir DRAGONBOARD 410c kan aanpas vir 'n kombinasie van korrespondensie.

invoer timeimport reeks -invoer pandas as pd invoer numpy as np

# Configuração da conexão reeks

ser = serial. Serial (port = '/dev/ttyAMC0', #tty96B0 ', baudrate = 250000, parity = serial. PARITY_NONE, stopbits = serial. STOPBITS_ONE, bytesize = serial. EIGHTBITS)

ser.isOpen ()

print ('Voer u opdragte hieronder in. / r / nGee' exit 'in om die toepassing te verlaat.')

invoer = 1

terwyl 1: input = input (">>") as input == 'exit': ser.close () exit () elif input == 'read': ser.write (0) # Envia o comando para o Arduino DUE realizar a coleta dos dados ser.write (1) # Envia o comando para o Arduino DUE transmitir os dados coletados

lista =

vir i in reeks (3000):

ser.write (i/256) ser.write ((i <0: out = ser.read (2) if (out == 0x0002): atual = 0 c = ser.read (1) terwyl (c! = 0xFF): atual << 8 atual += cc = ser.read (1) lista.append (atual)

Stap 8: INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO

INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO
INTERPRETAÇÃO DOS ARQUIVOS DE AUDIO

Vir 'n poder realizar uma primeira análise dos dados obtidos através do sensor, se fez needsária and conversão dos arquivos no formato WAV, fornecidos pelos alunos autores do TCC e colaboradores do projeto, para valores numéricos, que são utilizados nos algoritados de análise. Vir 'n realistiese vertaling kan ons die algoritme van PYTHON 3 gebruik om 'n WAV -e -pos te stuur wat ons in die CSV -funksie kan gebruik. Ons kan ook 'n algoritme gebruik om dit af te laai.

Dit is 'n algoritme wat noodsaaklik is vir 'n funksionering van 'n stelsel, ja dat dit Arduino kan wees, omdat dit 'n groot aantal funksies kan wees.

# kodering: utf-8

# Leitura e conversão dos audios para csv

# MÓDULOS UTILIZADOS

invoer golf invoer numpy as np invoer pandas as pd invoer matplotlib.pyplot as plt

# FUNÇÃO PARA CONVERTER WAV EM DADOS DO ESPECTRO E SALVAR CSV

def audio_to_csv (file_name): wave_file = wave.open (file_name+'. wav', 'rb') data_size = wave_file.getnframes () sample_rate = wave_file.getframerate () time_step = 1/sample_rate waveData = wave_file.readframes (data_size-1)) sein = np.fromstring (waveData, dtype = 'int32') Tyd = np.linspace (start = 0, stop = data_size/sample_rate, num = data_size, endpoint = True) df = pd.concat ([pd. DataFrame (sein), pd. DataFrame (Tyd)], as = 1) df.to_csv (lêernaam + '.csv', indeks = Onwaar) gee terug df

# CARREGANDO -GEGEVENSRAM COM COM DADOS DO AUDIO

file_name = 'Solo_com_Vazamento' df_vazamento = audio_to_csv (lêernaam) df_vazamento.columns = ['amp', 'time'] file_name = 'Solo_sem_Vazamento' df_sem_vazamento = audio_to_csv (file_name) df_sem._ '

# GRÁFICO DO ESPECTRO DE AUDIO

figuur, (ax1, ax2) = plt.subplotte (nrows = 2, ncols = 1, figsize = (20, 10)) ax1.plot (df_vazamento ['time'], df_vazamento ['amp']) ax1.set_title ('Solo com Vazamento', fontdict = {'fontsize': 20, 'fontweight': 'bold'}) ax1.set_xlabel ('Tempo [s]', fontdict = {'fontsize': 16}) ax1.set_ylim ([-4e8, 4e8]) ax2.plot (df_sem_vazamento ['time'], df_sem_vazamento ['amp']) ax2.set_title ('Solo sem Vazamento', fontdict = {'fontsize': 20, 'fontweight': 'bold' }) ax2.set_xlabel ('Tempo [s]', fontdict = {'fontsize': 16}) ax2.set_ylim ([-4e8, 4e8]) figure.tight_layout (h_pad = 5) plt.show ()

Stap 9: Visueel doen Sinal

Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal
Análise Visual Do Sinal

In PYTHON 3 kan ons 'n transformasie van Fourier maak, 'n artificio matemático realiza a transformação do sinal do domínio do tempo para o domínio da frequência, onde se torna possível analisar as varias frequências, and so amplitudes, que compõem aquele sinal. Die visuele analise van die transformasie van die Fourier om 'n professionele com conhecimentos específicos poderá identifiseer 'n bestaan van 'n algum vazamento na tubulação. Estes gráficos servirão para validação das análises realizadas pelo algoritmo de detecção automática.

Beperk die frekwensie van 100Hz en 800Hz, en ons kan ook die frekwensie van die vazamentos sien.

# kodering: utf-8# Gebruik vir die transformasie van Fourier

import pandas as pd import numpy as np import wave from matplotlib import pyplot as plt# Função que realiza a transformada de Fourier e plota os gráficos para análise def Fourier (df_list): Fs = 44100; # Taxa de amostragem em Hz Ts = 1.0/Fs; # Intervalo de amostragem y = pd.concat (df_list) t = y ['time'] # Vetor de tempos y = y ['amp'] # Vetor de amplitudes n = len (y) # Comprimento do sinal k = np. arange (n) T = n/Fs frq = k/T frq = frq [reeks (n // 2)] Y = np.fft.fft (y)/n Y = Y [reeks (n // 2)] tmp = pd. DataFrame () tmp ['amp'] = abs (Y) tmp ['freq'] = frq max_lim = max (tmp ['amp'] [(tmp ['freq']> = 100) & (tmp ['freq'] <= 800)]) fig, ax = plt.subplots (2, 1, figsize = (20, 10)) ax [0]. plot (t, y) ax [0].set_xlabel ('Time') ax [0].set_ylabel ('Amplitude') ax [1]. Plot (frq, abs (Y), 'r') ax [1].set_xlim ([100, 800]) ax [1].set_ylim ([0, max_lim]) ax [1].set_xlabel ('Freq (Hz)') ax [1].set_ylabel ('| Y (freq) |') plt.show () return frq, abs (Y)# Função que realiza a carga dos dados to CSV and chama a função de Fourier def read_csv (file_name, init, final): df = pd.read_csv (file_name + '.csv') df.columns = ['amp', ' time '] delta = final-init if init*44100> len (df) or final*44100> len (df): init = (len (df)/44100) -delta if init = 100) & (df [' freq '] <= 800)] mx = gesorteer (df [' amp ']) print ("Média das amplitudes:", np.round (np.mean (mx))) print ("Percentuais em relação a média das amplitudes.") print ("100 maiores amplitudes", np.mean (mx [-100:]) // df ['amp']. mean ()*100, "%", sep = "") print ("50 maiores amplitudes:", np.mean (mx [-50:]) // df ['amp']. mean ()*100, "%", sep = "") print ("10 maiores amplitudes:", np.mean (mx [-10:]) // df ['amp']. mean ()*100, "%", sep = "") print ("Maior amplitude:", np.mean (mx [-1:]) // df ['amp']. mean ()*100, " %", sep =" ") read_csv ('Solo_com_Vazamento', 2, 10) # Exemplo de gráficos para vazamentoread_csv ('Solo_sem_Vazamento', 2, 10) # Exemplo de gráficos para sem vazamento

Stap 10: Algoritmo Em R Para Extração Das Features Dos Dados

Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados
Algoritmo Em R Para Extração Das Features Dos Dados

Gebruik die algoritme om 'n werklikheid of 'n ekstra funksie (eienskappe) van hierdie funksies te gee.

Este primeiro algoritmo realiza uma extração identification, onde é needsário saber se o arquivo de áudio trata-se de uma amostra vazamento detectado ou não, isso por que us us resultants deses processo servirão para o trainamento da rede neurale utilizada.

Para quando o sistema estiver em modo de operação um algoritmo um pouco diferente será executado, onde não este fará a extração não identifierada, gerando somente as características sem uma identifação.

Estas features ou caraterísticas são propriedades acústicas compostas por varias informações referentes ao espectro de áudio capturado, abaixo seguirá uma descrição (em inglês) destas características.

Este algoritmo kan ons 'n spesifieke GitHub -e -posadres vir die skakel gee, of vir 'n spesiale aanpassing vir die projek.

Die sagteware wat ons kan gebruik om die algoritme gratis te laai, kan die interpretasie van die Studio aflaai.

Karakteristieke ekstra:

  • gemiddelde frekwensie: gemiddelde frekwensie (in kHz)
  • sd: standaardafwyking van frekwensie
  • mediaan: mediaanfrekwensie (in kHz)
  • Q25: eerste kwantiel (in kHz)
  • Q75: derde kwantiel (in kHz)
  • IQR: interkwantiele reikwydte (in kHz)
  • skeef: skeefheid (sien aantekening in die spesifikasiebeskrywing)
  • kurt: kurtosis (sien aantekening in die spesifikasiebeskrywing)
  • sp.ent: spektrale entropie
  • sfm: spektrale vlakheid
  • modus: modusfrekwensie
  • centroid: frekwensie centroid (sien specprop)
  • piekf: piekfrekwensie (frekwensie met die hoogste energie)
  • meanfun: gemiddelde van die fundamentele frekwensie gemeet oor akoestiese sein
  • minfunksie: minimum fundamentele frekwensie gemeet oor akoestiese sein
  • maxfun: maksimum fundamentele frekwensie gemeet oor akoestiese sein
  • meandom: gemiddelde dominante frekwensie gemeet oor akoestiese sein
  • mindom: minimum dominante frekwensie gemeet oor akoestiese sein
  • maxdom: maksimum dominante frekwensie gemeet oor akoestiese sein
  • dfrange: reeks dominante frekwensie gemeet oor akoestiese sein
  • modindx: modulasie -indeks. Bereken as die opgehoopte absolute verskil tussen aangrensende metings van fundamentele frekwensies gedeel deur die frekwensiebereik
  • etiket: lekkasie of sonder lekkasie

Algoritme gebruik:

pakkette <- c ('tuneR', 'seewave', 'fftw', 'caTools', 'randomForest', 'warbleR', 'muise', 'e1071', 'rpart', 'xgboost', 'e1071') as (lengte (setdiff (pakkette, rownames (geïnstalleerde.pakkette ()))))> 0) {install.packages (setdiff (pakkette, rownames (geïnstalleerde.pakkette ()))))}

biblioteek (tuneR)

biblioteek (seewave) biblioteek (caTools) biblioteek (rpart) biblioteek (rpart.plot) biblioteek (randomForest) biblioteek (warbleR) biblioteek (muise) biblioteek (xgboost) biblioteek (e1071)

specan3 <- funksie (X, bp = c (0, 22), wl = 2048, drempel = 5, parallel = 1) { # Om parallelle verwerking te gebruik: biblioteek (devtools), install_github ('nathanvan/parallelsugar') as (class (X) == "data.frame") {if (all (c ("sound.files", "selec", "start", "end") % in % colnames (X))) {start <- as.numeric (unlist (X $ start)) end <- as.numeric (unlist (X $ end)) sound.files <- as.character (unlist (X $ sound.files)) selec <- as.character (unlist (X $ selec))} anders stop (plak (plak (c ("sound.files", "selec", "start", "end") [! (c ("sound.files", "selec", "start", "end") % in % colnames (X))], collapse = ","), "column (s) not found in data frame"))} stop anders ("X is nie 'n data raam nie") #as daar NA's in begin of eind stop is as (enige (is.na (c (einde, begin)))) stop ("NA's gevind in begin en/of einde") #as einde of begin nie numeriese stop is nie if (all (class (end)! = "numeric" & class (start)! = "numeric")) stop ("'end' en 'selec' moet numeries wees ') #as enige begin hoër is as eindstop as (enige (einde - begin <0)) stop (plak ("Die begin is hoër as die en d in ", lengte (wat (einde - begin20)) stop (plak (lengte (wat (einde - begin> 20))," seleksie (s) langer as 20 sek ")) opsies (show.error.messages = TRUE) #as bp nie vektor of lengte is nie! = 2 stop as (! is.vector (bp)) stop ("'bp' moet 'n numeriese vektor van lengte 2 'wees) anders {if (! lengte (bp) == 2) stop ("'bp' moet 'n numeriese vektor wees van lengte 2")} #return waarskuwing as nie alle klanklêers gevind is nie fs <- list.files (path = getwd (), pattern = ".wav $", ignore.case = WAAR) as (lengte (uniek (sound.files [(sound.files % in % fs)]))! = lengte (uniek (sound.files)))) kat (plak (lengte (uniek (klank. lêers))-lengte (uniek (sound.files [(sound.files % in % fs)])), ".wav-lêer (s) nie gevind nie")) #aantal klanklêers in werkende gids en as 0 stop d <- which (sound.files % in % fs) if (length (d) == 0) {stop ("Die.wav-lêers is nie in die werkgids nie")} anders {begin <- begin [d] einde <- end [d] selec <- selec [d] sound.files <- sound.files [d]} # As parallel nie numeries is as (! is.numeric (parallel)) stop ("'parallel' moet wees 'n numeriese vektor van lengte 1 ") as (enige (! (parallel %% 1 == 0), parallel 1) {opsies (waarsku = -1) as (alle (Sys.info () [1] ==" Windows ", requireNamespace (" parallelsugar ", stil = TRUE) == TRUE)) lapp <- function (X, FUN) parallelsugar:: mclapply (X, FUN, mc.cores = parallel) else if (Sys.info () [1] == "Windows") {cat ("Windows-gebruikers moet die 'parallelsugar'-pakket installeer vir parallelle rekenaar (u doen dit nie nou nie!)") Lapp <- pbapply:: pblapply} else lapp <- funksie (X, FUN) parallel:: mclapply (X, FUN, mc.cores = parallel)} anders lapp <- pbapply:: pblapply opsies (waarsku = 0) as (parallel == 1) kat ("Akoestiese parameters meet:") x <- as.data.frame (lapp (1: lengte (begin), funksie (i) {r <- tuneR:: readWave (file.path (getwd (), sound.files ), van = begin , tot = eindig , eenhede = "sekondes") b plafon ([email protected]/2000) - 1) b [2] < - plafon ([email protected]/2000) - 1 #frekwensiespektrumanalise songspec <- seewave:: spec (r, f = [email protected], plot = ONWAAR) analise <- seewave:: specprop (songspec, f = [email protected], flim = c (0, 280/1000), plot = ONWAAR) #save parameters meanfreq <- analise $ gemiddelde/1000 sd <- analise $ sd/1000 mediaan <- analise $ mediaan/1000 Q25 < - analise $ QQ75 <- analise $ QIQR <- analise $ IQR/1000 skeef <- analise $ skeefheid kurt <- analise $ kurtosis sp.ent <- analise $ sh sfm <- analise $ sfm modus <- analise $ mode/1000 centroid <- analise $ cent/1000 #Frekwensie met amplitude pieke piekf <- 0 #seewave:: fpeaks (songspec, f = [email protected], wl = wl, nmax = 3, plot = ONWAAR) [1, 1] #Fundamentele frekwensie parameters ff <- seewave:: fund (r, f = [email protected], ovlp = 50, drempel = drumpel, fmax = 280, ylim = c (0, 280/1000), plot = ONWAAR, wl = wl) [, 2] meanfun <-middel (ff, na.rm = T) minfun <-min (ff, na.rm = T) maxfun <-max (ff, na.rm = T) #Dominante frekwensie parameters y <- seewave:: dfreq (r, f = [email protected], wl = wl, ylim = c (0, 280/1000), ovlp = 0, plot = F, drempel = drumpel, bandpass = b * 1000, fftw = TRUE) [, 2] meandom <- gemiddelde (y, na.rm = TRUE) mindom <- min (y, na.rm = TRUE) maxdom <- max (y, na.rm = TRUE) dfrange <- (maxdom- mindom) duur <- (einde - begin ) #modulasie-indeksberekening verander <- vektor () vir (j waarin (! is. na (y))) {verandering <- abs (y [j]- y [j + 1]) verander <- voeg (verander, verander)} as (mindom == maxdom) modindx <-0 anders modindx <- beteken (veranderings, na.rm = T)/dfrange #save resultate terugkeer (c (duur, gemiddelde frekwensie, sd, mediaan, Q25, Q75, IQR, skeef, kurt, sp.ent, sfm, modus, sentroïde, piekf, gemiddelde funksie, minfun, maxfun, meandom, mindom, maxdom, dfrange, modindx))}))) verander resultate se name name (x) <- c ("duur", "meanfreq", "sd", "mediaan", "Q25", "Q75", "IQR", "skew", "kurt", "sp.ent", "sfm", "mode", "centroid", "peakf", "meanfun", "minfun", "maxfun", "meandom", "mindom", "maxdom", "dfrange", "modindx") x <- data.frame (sound.files, selec, as.data.frame (t (x))) kolumname (x) [1: 2] <- c ("sound.files", "selec") naamname (x) <- c (1: nrow (x)) return (x)}

processFolder <- function (folderName) { # Begin met leë data.frame. data <- data.frame () # Kry lys met lêers in die gids. list <- list.files (folderName, '\. wav') # Voeg lêerlys by data.frame vir verwerking. vir (lêernaam in lys) {ry <- data.frame (lêernaam, 0, 0, 20) data <- rbind (data, ry)} # Stel kolomname. name (data) <- c ('sound.files', 'selec', 'start', 'end') # Skuif na die gids vir verwerking. setwd (mapnaam) # Verwerk lêers. akoestiek <- specan3 (data, parallel = 1) # Skuif terug na die ouermap. setwd ('..') akoestiek}

gender <- function (filePath) {if (! exist ('genderBoosted')) {load ('model.bin')} # Opstelpaaie. currentPath <- getwd () fileName <- basename (filePath) pad <- dirname (filePath) # Stel gids in om lêer te lees. setwd (pad) # Begin met leë data.frame. data <- data.frame (lêernaam, 0, 0, 20) # Stel kolomname in. name (data) <- c ('sound.files', 'selec', 'start', 'end') # Verwerk lêers. akoestiek <- specan3 (data, parallel = 1) # Herstel pad. setwd (currentPath) voorspel (genderCombo, newdata = akoestiek)}

# Laai data

lekkasie <- processFolder ('caminho para o pasta com samples de áudio com vazamento') without_leakage <- processFolder ('caminho para o pasta com samples de áudio sem vazamento')

# Stel etikette op.

lekkasie $ label <- 1 without_leakage $ label <- 2 data <- rbind (lekkasie, sonder_lekkage) data $ label <- factor (data $ label, labels = c ('leakage', 'without_leakage'))

# Verwyder ongebruikte kolomme.

data $ duur <- NULL data $ sound.files <- NULL data $ selec <- NULL data $ peakf <- NULL

# Verwyder rye wat NA bevat.

data <- data [complete.cases (data),]

# Skryf csv -datastel neer.

write.csv (data, file = 'features.csv', sep = ',', row.names = F)

Stap 11: Verlos neuraal

Verlos neuraal
Verlos neuraal

'N Idee wat ons neuraal kan gebruik, is 'n realistiese herontwikkeling van outomatiese funksies wat ons in staat stel om die sensoriese toestand van die liggaam te verander.

'N Lae neurale gebruik van MLP (Multilayer Perceptron), 'n model wat een van die voorgaande kan identifiseer en 'n model vir die implantasie van 'n stelsel vir die identifisering van 'n outomatiese herkenning van inligting kan gee.

Dit is noodsaaklik dat ons 'n filtreerder vir ons kan ontvang, maar ook dat ons 'n spesifieke karakter kan gebruik om die melhora-la te herwin. Não foi realizado nenhuma abordagem estatística muito aprofundada, mas mesmo com um trabalho mais oppervlakkige pode-se asyn en algumas variáveis com bons desempenhos.

Vir ons kan ons 'n model vir 100%of meer waarneem, maar ons kan dit ook op 'n ander manier sien.

Este algoritmo en utilization for a modelo da rede and retornar a taxa de acerto do mesmo. Daar is geen stelsel om die algoritme vir verskillende funksies te gebruik nie, maar u kan ook die werklike model tref, of nou kan u die werklike model as 'n model vir realisasie gebruik.

# kodering: utf-8

voer pandas as pd in

invoer numpy as np van sklearn.model_selection invoer train_test_split as tts van sklearn.neural_network invoer MLPClassifier as MLP van sklearn.metrics invoerklassifikasie_rapport as cr van sklearn.metrics invoer confusion_matrix as cm

# Leer hoe om CSV te doen

df = pd.read_csv ('features.csv') # Separação das entradas df_X = df [df.columns [: len (df.columns) -1] # Filtrando as entradas df_X = df_X

# Separando dados para treino e teste

X_train, X_test, Y_train, Y_test = tts (df_X, df_Y, test_size = 0.1)

# Criando modelo de rede neurale

modelo = MLP (alfa = 0.0001, learning_rate_init = 0.0001, hidden_layer_sizes = (50, 50, 50, 50), max_iter = 10000, activation = 'tanh', solver = 'lbfgs')

# Treinando modelo

modelo.fit (X_train, Y_train) resultaat = modelo.predict (X_test)

# Imprimindo resultados

report = cr (Y_test, result) mat = cm (y_pred = result, y_true = Y_test) print ("Matriz de confusão") print (mat, end = "\ n / n") print ("Relatório de Classificação") druk (verslag)

Aanbeveel: