สารบัญ:

Sistema Autônomo Localizador De Vazamentos: 11 ขั้นตอน
Sistema Autônomo Localizador De Vazamentos: 11 ขั้นตอน

วีดีโอ: Sistema Autônomo Localizador De Vazamentos: 11 ขั้นตอน

วีดีโอ: Sistema Autônomo Localizador De Vazamentos: 11 ขั้นตอน
วีดีโอ: How to make a hydraulic hose? | KRAMP 2024, พฤศจิกายน
Anonim
Sistema Autônomo Localizador De Vazamentos
Sistema Autônomo Localizador De Vazamentos

Este projeto ประกอบด้วย 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 o กระบวนการ porne uma dos สีแดง อูมา ทูบูลาเซา

O processamento destes dados é realizado por algoritmos ติดตั้งบน DRAGONBOARD 410c. Os dados também são enviados para um serviço na nuvem, ตอบกลับโดย auxiliar no processo de Integência ประดิษฐ์ตามโครงการ.

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. โกเมส โปโล และ โรนัลโด้ พี. โกเมส โปโล ผู้เข้าร่วมโครงการหรือศิษย์เก่า Daniel de Castro Pacheco จบการศึกษาจากมหาวิทยาลัยในมหาวิทยาลัย Newton Paiva de Belo Horizonte O projeto contou com o apoio dos graduandos de engenharia mecatrônica da FACENS, Lucas Nunes Monteiro และ Felipe Crispim da Silva Salvagnini

ขั้นตอนที่ 1: Lista De Materiais

Lista De Materiais
Lista De Materiais

Para realização deste projeto, ระบบปฏิบัติการ seguintes การใช้งานสำหรับฟอรัม:

1 Arduino Due

1 กระดานมังกร 410c

2 ไดรเวอร์สำหรับมอเตอร์ de corrente ต่อเนื่อง contendo cada um:

4 ทรานซิสเตอร์ BC548

4 ไดโอด 1n4007

4 ตัวต้านทาน 4k7Ω ¼ W

1 ไดรเวอร์สำหรับการแข่งขันเซอร์โวมอเตอร์:

1 ทรานซิสเตอร์ BC548

1 ไดโอด 1N4007

1 ตัวต้านทาน 4k7Ω ¼ W

1 เมาส์ USB

1 เทคลาโด USB

1 จอภาพ

1 Cabo HDMI

1 โรโบ เด เอสเตราส - Plataforma Zumo

1 มินิ dispositivo de cremalheira e engrenagem

1 เซอร์โวมอเตอร์ 9g

ขั้นตอนที่ 2: Adaptação Mecânica

Image
Image

สำหรับ aquisição dos dados pelo sensor piezoelétrico, faz se necessário, o desenvolvimento de um dispositivo com pinhão e cremalheira, Conforme desenhos anexados, neste caso as peças foram fabricadas por umatar impressidoum a pro, จังหวะของการดำเนินการ, fixou-se o dispositivo na plataforma zumo, utilizando fita dupla face, Conforme vídeo

ขั้นตอนที่ 3: Acionamento Dos Motores

Obtenção Do Áaudio
Obtenção Do Áaudio

ระบบปฏิบัติการสำหรับมอเตอร์ที่ทำ robô ZUMO e do dispositivo de captura, fez-se necessária a montagem de dois drivers สำหรับ os motores de corrente คอนเนคเตอร์ e um driver สำหรับเซอร์โวมอเตอร์, สอดคล้องกับ figuras acima, sendo a primeira figura o driver para um motor de corrente ต่อเนื่อง ea segunda o ไดรเวอร์สำหรับเซอร์โวมอเตอร์

ขั้นตอนที่ 4: Obtenção Do Áaudio

ที่ด้านบนสุดของเสียง das vibrações do solo, foi utilizado um dispositivo desenvolvido como parte do TCC ของ Engenharia Mecatrônica dos graduandos Lucas Nunes Monteiro e Felipe C. da Silva Salvagnini, เพื่อนร่วมงานที่อาศัยอยู่ที่ห่างไกล อีเมล [email protected]

Este dispositivo utiliza-se de um เซ็นเซอร์ piezoelétrico e uma placa de circuito que realiza a filtragem e amplificação do sinal.

เป็นความถี่ของความถี่สำหรับ o 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 estarada pelo meos duasquest.

Aquisição é habilitada และ desabilitada através da interrupção do Arduino DUE

ขั้นตอนที่ 5: กำหนดค่า Do Arduino DUE (ภาษา C)

กำหนดค่า Do Arduino DUE (ภาษา C)
กำหนดค่า Do Arduino DUE (ภาษา C)

ทุ่มเทให้กับงบประมาณทั้งหมด, มากกว่า 3000 ต่อพอร์ตสำหรับ segundo, ใช้งาน 32 บิต, ใช้งานจริงผ่านเซ็นเซอร์และความจำเป็นสำหรับการประมวลผลสำหรับอัลกอริทโมสบน DRAGONBOARD 410c, สำหรับ Arduino ใช้งานจริงสำหรับ Arduino กระบวนการที่จำเป็น, จำเป็นสำหรับ por que o Shield สำหรับอินเทอร์เฟซ Grove Seeed Sensor Mezzanine ติดตั้งบน DRAGONBOARD 410c, ต่อด้วยไมโครคอนโทรลเลอร์ ATmega 328, ก่อนหน้า

O Arduino เนื่องจากการกำหนดค่าสำหรับ receber os comandos enviados da plataforma QUALCOMM DRAGONBOARD 410c ผ่าน comunicação serial

ในฐานะที่เป็นคอนฟิกูเรชันไม่มี Arduino foram:

Realizar aquisição dos dados;

ตัวส่งผ่านระบบ obtidos สำหรับ DRAGONBOARD 410c;

ต่อโปรแกรม:

#รวม#define Numb_Sample 3000 #define DAC_Input A0

#กำหนด SERVO 7

#define PosServoMin 4 #define PosServoMax 6 #define ระยะเวลา 60 unsigned int Scont=0, SNow=PosServoMin; DAC int ยาวที่ไม่ได้ลงนาม[Numb_Sample], ind=Numb_Sample; เป็นโมฆะ TC3_Handler () { TC_GetStatus (TC1, 0); ถ้า (ind < Numb_Sample) DAC[ind++] = analogRead (DAC_Input); ถ้า(Scont

1); // 50% รอบการทำงาน

TC_SetRC(tc, ช่อง, rc); TC_Start(tc, ช่อง); tc->TC_CHANNEL[ช่อง]. TC_IER = TC_IER_CPCS | TC_IER_CPAS; // habilita ระบบปฏิบัติการ registradores tc->TC_CHANNEL[channel]. TC_IDR = ~(TC_IER_CPCS | TC_IER_CPAS); // desabilita ระบบปฏิบัติการ registradores NVIC_EnableIRQ(irq); // habilita interrupção }

การตั้งค่าเป็นโมฆะ ()

{ Serial.begin (115200); โหมดพิน (DAC_Input, INPUT); TimerStart(TC1, 0, TC3_IRQn, 1500); // เริ่มจับเวลา //TC_Stop(TC1, 0); โหมดพิน (SERVO, OUTPUT); }

วงเป็นโมฆะ ()

{ /*//while(!Serial.available()); ถ่าน rc;//=Serial.read(); ดัชนี int = 0; if(rc==0) { while(!Serial.available()); rc=Serial.read(); สวิตช์ (rc) { กรณีที่ 1: ดัชนี = 0; ในขณะที่(!Serial.available()); ในขณะที่ ((rc=Serial.read())!=0xFF) { ดัชนี <<= 8; ดัชนี += rc; ในขณะที่(!Serial.available()); } Serial.print(0); Serial.print(2); SendNumber(DAC[ดัชนี]); Serial.print(0xFF); หยุดพัก; กรณีที่ 3: ในขณะที่ (!Serial.available()); if((Serial.read())==0xFF) { SNow=PosServoMax; ล่าช้า (500); ind=0; //TC_Start(TC1, 0); ในขณะที่ (ind<Numb_Sample); //TC_Stop(TC1, 0); SNow=PosServoMin; ล่าช้า (500); Serial.print(0); Serial.print(4); Serial.print(0xFF); } หยุดพัก; } } else if(rc=='2') { Serial.print("ทดสอบเซอร์โวมอเตอร์\n"); ในขณะที่(!Serial.available()); rc=Serial.read(); if(rc=='1') { Serial.print("โหมด 1\n"); หิมะ=PosServoMax; } if(rc=='2') { Serial.print("โหมด 2\n"); SNow=PosServoMin; } } */ SNow=PosServoMax; ล่าช้า (100); SNow=PosServoMin; ล่าช้า (100); }

ขั้นตอนที่ 6: Interfaceamento Das Tecnologias

Interfaceamento Das Tecnologias
Interfaceamento Das Tecnologias

สำหรับการติดต่อสื่อสารระหว่างกัน กับ Arduíno DUE ea DRAGONBOARD 410c, การใช้งานทั่วไป-อินเทอร์เฟซสำหรับ Arduino, o que não foi possível executar, então optou-se pelo uso de uma interface USB CDR entre BOARD necessitaria da recompilação do KERNEL da DRAGONBOARD 410c, que não se fez por causa do curto จังหวะการแสดง

ขั้นตอนที่ 7: กำหนดค่า Da DRAGONBOARD 410c (Python)

กำหนดค่า Da DRAGONBOARD 410c (Python)
กำหนดค่า Da DRAGONBOARD 410c (Python)

กำหนดค่าสำหรับสภาพแวดล้อมสำหรับ Arduino DUE os comandos para realizar aquisição de dados e sendir os dados obtidos Segue codigo abaixo.

การสังเกต: A abordagem 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. Por isso optou-se pelo interfaceamento USB, que necessitaria da recompilação do KERNEL na DRAGONBOARD 410c สำหรับ que a porta fosse criada corretamente para a comunicação.

นำเข้า timeimport แพนด้านำเข้าซีเรียลเป็น pd นำเข้าจำนวนเป็น np

# Configuração da conexão serial

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

ser.isOpen()

print('ป้อนคำสั่งของคุณด้านล่าง\r\nแทรก "exit" เพื่อออกจากแอปพลิเคชัน')

อินพุต=1

ในขณะที่ 1: input = input(">> ") if input == 'exit': ser.close() exit() elif input == 'read': ser.write(0) # Envia o comando para o Arduino DUE ใช้งานจริง coleta dos dados ser.write(1) # Envia o comando para o Arduino DUE เครื่องส่งสัญญาณ os dados coletados

รายการ =

สำหรับฉันอยู่ในช่วง (3000):

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

ขั้นตอนที่ 8: INTERPRETACÃO DOS ARQUIVOS DE AUDIO

INTERPRETACÃO DOS ARQUIVOS DE AUDIO
INTERPRETACÃO DOS ARQUIVOS DE AUDIO

มากกว่า ความเป็นจริง มากกว่า สำคัญ การวิเคราะห์ ที่ dos dados obtidos através do sensor, จำเป็น จำเป็น การสนทนา ในรูปแบบ WAV, fornecidos pelos alunos autores do TCC e colaboradores do projeto, para valores al numéricoss บอร์ด มากกว่า บอร์ด มากกว่า บอร์ด มากกว่า บอร์ด. Para realizar esta conversão foi escrito um algoritmo em PYTHON 3 que lê o arquivo WAV e salva os dados do espectro em um arquivo CSV O algoritmo utilizado segue abaixo e em anexo para ดาวน์โหลด

อัลกอริทึม ก่อนหน้า จำเป็น สำหรับ o funcionameto do sistema, já que o Arduino DUE já enviará ess dados em um array de valores numéricos.

# การเข้ารหัส: utf-8

# Leitura และการสนทนา dos ไฟล์เสียงสำหรับ csv

# MÓDULOS UTILIZADOS

นำเข้าคลื่นนำเข้า numpy เป็น np นำเข้าแพนด้าเป็น pd นำเข้า matplotlib.pyplot เป็น plt

# ตัวแปลง FUNÇÃO PARA WAV EM DADOS ทำ ESPECTRO E SALVAR CSV

def เสียง) สัญญาณ = np.fromstring(waveData, dtype='int32') Time=np.linspace(start=0, stop=data_size/sample_rate, num=data_size, endpoint=True) df = pd.concat([pd. DataFrame(สัญญาณ), pd. DataFrame(Time)], axis=1) df.to_csv(file_name + '.csv', index=False) return df

# CARREGANDO DATA FRAME COM OS DADOS DO AUDIO

file_name = 'Solo_com_Vazamento' df_vazamento = audio_to_csv (file_name) df_vazamento.columns = ['amp', 'time'] file_name = 'Solo_sem_Vazamento' df_sem_vazamento = audio_to_names_csv' (ไฟล์])

# GRÁFICO DO ESPECTRO DE AUDIO

รูป (ax1, ax2) = plt.subplots(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()

ขั้นตอนที่ 9: Análise Visual Do Sinal

อนาลิเซ วิชวล โด ซินาล
อนาลิเซ วิชวล โด ซินาล
อนาลิเซ วิชวล โด ซินาล
อนาลิเซ วิชวล โด ซินาล
อนาลิเซ วิชวล โด ซินาล
อนาลิเซ วิชวล โด ซินาล

Com o PYTHON 3 é realizada a transformada de Fourier, este 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êmciasque แอมพลิจูด. คำอธิบาย visual do gráfico da transformada de Fourier um profissional com conhecimentos específicos poderá identificar a residence de algum vazamento na tubulação. Estes graficos servirão para validação das análises realizadas pelo algoritmo de detecção automática.

ขีด จำกัด ของความถี่ที่ 100Hz และ 800Hz, fica claro มีอยู่จริง vazamentos quando se observam distúrbios nesse range de frequências.

# การเข้ารหัส: utf-8# Módulos utilizados para processamento da transformada de Fourier

นำเข้าแพนด้าเป็น pd นำเข้า numpy เป็นคลื่นนำเข้า np จาก matplotlib นำเข้า pyplot เป็น plt# Função que realiza a transformada de Fourier e plota os gráficos para análise def Fourier(df_list): Fs = 44100; # แท็ก amostragem em Hz Ts = 1.0/Fs; # Intervalo de amostragem y = pd.concat(df_list) t = y['time'] # Vetor de tempos y = y['amp'] # ความกว้างของคลื่น n = len (y) # Comprimento do sinal k = np arange(n) T = n/Fs frq = k/T frq = frq[range(n//2)] Y = np.fft.fft(y)/n Y = Y[range(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('เวลา') ขวาน[0].set_ylabel('แอมพลิจูด') ขวาน[1].plot(frq, abs(Y), 'r') ขวาน[1].set_xlim([100, 800]) ขวาน[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 do CSV e 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) หรือ final*44100 > len(df): init = (len(df)/44100)-delta if init =100) & (df['freq ']<=800)] mx = เรียงลำดับแล้ว (df['amp']) print("Media das amplitudes:", np.round(np.mean(mx))) print("Percentuais em relação a média das amplitudes.") พิมพ์ ("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'] หมายถึง()*100, "%", sep="") print("Maior amplitude:", np.mean(mx[-1:])//df['amp'].mean()*100, " %", sep="")read_csv('Solo_com_Vazamento', 2, 10) # ตัวอย่างสำหรับ vazamentoread_csv('Solo_sem_Vazamento', 2, 10) # แบบอย่างสำหรับ sem vazamento

ขั้นตอนที่ 10: Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados

Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados
Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados
Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados
Algoritmo Em R Para Extração Das คุณสมบัติ Dos Dados

Utilizou-se um algoritmo em R para realizar o กระบวนการและคุณสมบัติพิเศษ (características) dos dados obtidos

Este primeiro algoritmo realiza uma extração identificada, onde é necessário saber se o arquivo de áudio trata-se de uma amostra vazamento detectado ou não, isso por que os dados resultantes desse การประมวลผล เซิร์ฟเวอร์ tre o da สีแดง

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 identificada, gerando somente เป็น características sem uma identificação

Estas แสดงคุณลักษณะ 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 faz parte de um projeto disponível no GitHub e pode ser acessado através deste link, หรือ mesmo foi modificado para atender as especificações do projeto.

O software usado para rodar o algoritmo é gratuito ดาวน์โหลด do interpretador R e do R Studio

Características extraídas:

  • ความถี่เฉลี่ย: ความถี่เฉลี่ย (เป็น kHz)
  • sd: ส่วนเบี่ยงเบนมาตรฐานของความถี่
  • ค่ามัธยฐาน: ความถี่มัธยฐาน (เป็น kHz)
  • Q25: ควอนไทล์แรก (เป็น kHz)
  • Q75: ควอนไทล์ที่สาม (เป็น kHz)
  • IQR: ช่วงอินเตอร์ควอนไทล์ (เป็น kHz)
  • เอียง: ความเบ้ (ดูหมายเหตุในคำอธิบาย specprop)
  • kurt: kurtosis (ดูหมายเหตุในคำอธิบาย specprop)
  • sp.ent: สเปกตรัมเอนโทรปี
  • sfm: ความเรียบของสเปกตรัม
  • โหมด: โหมดความถี่
  • centroid: centroid ความถี่ (ดู specprop)
  • peakf: ความถี่สูงสุด (ความถี่ที่มีพลังงานสูงสุด)
  • Meanfun: ค่าเฉลี่ยของความถี่พื้นฐานที่วัดผ่านสัญญาณอะคูสติก
  • minfun: ความถี่พื้นฐานขั้นต่ำที่วัดจากสัญญาณอะคูสติก
  • maxfun: ความถี่พื้นฐานสูงสุดที่วัดผ่านสัญญาณเสียง
  • ค่าเฉลี่ย: ค่าเฉลี่ยของความถี่เด่นที่วัดผ่านสัญญาณอะคูสติก
  • Mindom: ความถี่ต่ำสุดที่วัดผ่านสัญญาณอะคูสติก
  • maxdom: ความถี่สูงสุดที่วัดผ่านสัญญาณอะคูสติก
  • dfrange: ช่วงความถี่เด่นที่วัดผ่านสัญญาณอะคูสติก
  • modindx: ดัชนีการมอดูเลต คำนวณจากผลต่างสัมบูรณ์สะสมระหว่างการวัดความถี่พื้นฐานที่อยู่ติดกันหารด้วยช่วงความถี่
  • ฉลาก: รั่วหรือไม่รั่วไหล

อัลกอริทโม อูซาโด:

แพ็คเกจ <- c ('tuneR', 'seewave', 'fftw', 'caTools', 'randomForest', 'warbleR', 'mice', 'e1071', 'rpart', 'xgboost', 'e1071') ถ้า (ความยาว (setdiff (แพ็คเกจ ชื่อแถว (installed.packages ()))) > 0) { install.packages (setdiff (แพ็คเกจ ชื่อแถว (installed.packages ()))) }

ห้องสมุด(tuneR)

ห้องสมุด (seewave) ห้องสมุด (caTools) ห้องสมุด (rpart) ห้องสมุด (rpart.plot) ห้องสมุด (randomForest) ห้องสมุด (warbleR) ห้องสมุด (หนู) ห้องสมุด (xgboost) ห้องสมุด (e1071)

specan3 <- function(X, bp = c(0, 22), wl = 2048, threshold = 5, parallel = 1){ # ในการใช้การประมวลผลแบบขนาน: library(devtools), install_github('nathanvan/parallelsugar') if(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() ไม่แสดงรายการ(X$selec)) } else stop(paste(paste(c("sound.files", "selec", "start", "end")[!(c("sound.files", "selec", "start", "end") %in% colnames(X))], dissolve=", "), "column(s) not found in data frame")) } else stop("X ไม่ใช่ data frame") #if มี NA ใน start หรือ end stop if(any(is.na(c(end, start)))) stop("NAs found in start and/or end") #if end or start ไม่ใช่ตัวเลขหยุด if(all(class(end) != "numeric" & class(start) != "numeric")) stop("'end' and 'selec' ต้องเป็นตัวเลข") #if ใด ๆ เริ่มต้นที่สูงกว่า end หยุด if(any(end - start<0)) stop(paste("การเริ่มต้นสูงกว่า en d in", length((ซึ่ง(สิ้นสุด - start20))) หยุด(paste(length(((end - start>20))), "selection(s) นานกว่า 20 วินาที")) ตัวเลือก(show.error.messages = TRUE) #if bp ไม่ใช่เวกเตอร์หรือความยาว!=2 หยุด if(!is.vector(bp)) stop("'bp' ต้องเป็นเวกเตอร์ตัวเลขที่มีความยาว 2") else{ if(!length(bp) == 2) stop("'bp' ต้องเป็นเวกเตอร์ตัวเลขที่มีความยาว 2")} #return warning หากไม่พบไฟล์เสียงทั้งหมด fs <- list.files(path = getwd(), pattern = ".wav$", ละเว้นกรณี = จริง) if(length(unique(sound.files[(sound.files %in% fs)])) != length(unique(sound.files))) cat(paste(length(unique(sound.files))) cat(paste(length(unique(sound.files))) files))-length(unique(sound.files[(sound.files %in% fs)])), ".wav file(s) not found")) #นับจำนวนไฟล์เสียงในไดเร็กทอรีการทำงาน และถ้า 0 หยุด d <- which(sound.files %in% fs) if(length(d) == 0){ stop("ไฟล์.wav ไม่ได้อยู่ในไดเร็กทอรีการทำงาน") } else { start <- start[d] end <- end[d] selec <- selec[d] sound.files <- sound.files[d] } # ถ้า Parallel ไม่ใช่ตัวเลข if(!is.numeric(parallel)) stop("'parallel' must เป็นเวกเตอร์ตัวเลขที่มีความยาว 1") if(any(!(parallel %% 1 == 0), parallel 1) { options(warn = -1) if(all(Sys.info()[1] == " Windows", requireNamespace("parallelsugar", อย่างเงียบ ๆ = TRUE) == TRUE)) lapp <- function(X, FUN) parallelsugar::mclapply(X, FUN, mc.cores = parallel) else if(Sys.info() [1] == "Windows"){ cat("ผู้ใช้ Windows ต้องติดตั้งแพ็คเกจ 'parallelsugar' สำหรับการคำนวณแบบขนาน (คุณไม่ได้ทำตอนนี้!)") lapp <- pbapply::pblapply} อื่น lapp <- function (X, FUN) parallel::mclapply(X, FUN, mc.cores = parallel)} else lapp <- pbapply::pblapply options(warn = 0) if(parallel == 1) cat("การวัดพารามิเตอร์อะคูสติก:") x <- as.data.frame(lapp(1:length(start), function(i) { r <- tuneR::readWave(file.path(getwd(), sound.files), from = start ถึง = end หน่วย = "seconds") b เพดาน([email protected]/2000) - 1) b[2] <- ceiling([email protected]/2000) - 1 #frequency สเปกตรัมการวิเคราะห์เพลงสเปค <- seewave::spec(r, f = [email protected], plot = FALSE) การวิเคราะห์ <- seewave::specprop(songspec, f = [email protected], flim = c(0, 280/1000), plot = FALSE) #save พารามิเตอร์ meanfreq <- analysis$mean/1000 sd <- ค่ามัธยฐานของการวิเคราะห์$sd/1000 <- ค่ามัธยฐานของการวิเคราะห์$ค่ามัธยฐาน/1000 Q25 < - การวิเคราะห์$QQ75 <- การวิเคราะห์$QIQR <- การวิเคราะห์$IQR/1000 ความเบ้ <- การวิเคราะห์$ความเบ้ kurt <- การวิเคราะห์$kurtosis sp.ent <- การวิเคราะห์$sh sfm <- การวิเคราะห์$sfm โหมด <- การวิเคราะห์$โหมด/1000 centroid <- การวิเคราะห์$cent/1000 #ความถี่ที่มีความกว้างสูงสุด peakf <- 0#seewave::fpeaks(songspec, f = [email protected], wl = wl, nmax = 3, plot = FALSE)[1, 1] #พารามิเตอร์ความถี่พื้นฐาน ff <- seewave::fund(r, f = [email protected], ovlp = 50, threshold = threshold, fmax = 280, ylim=c(0, 280/1000), plot = FALSE, wl = wl)[, 2] meanfun<-mean(ff, na.rm = T) minfun<-min(ff, na.rm = T) maxfun<-max(ff, na.rm = T) #พารามิเตอร์ความถี่ที่โดดเด่น y <- seewave::dfreq(r, f = [email protected], wl = wl, ylim=c(0, 280/1000), ovlp = 0, plot = F, threshold = threshold, bandpass = b * 1000, fftw = TRUE)[, 2] meandom <- หมายถึง (y, na.rm = TRUE) ความคิด <- min(y, na.rm = TRUE) maxdom <- max (y, na.rm = TRUE) dfrange <- (maxdom - mindom) ระยะเวลา <- (end - start) #modulation index การคำนวณเปลี่ยนแปลง <- vector() for(j in which(!is. na(y))){ เปลี่ยน <- abs(y[j] - y[j + 1]) เปลี่ยนแปลง <- ผนวก (เปลี่ยนแปลง เปลี่ยนแปลง) } if(mindom==maxdom) modindx<-0 else modindx <- หมายถึง (การเปลี่ยนแปลง na.rm = T)/dfrange #save ผลลัพธ์กลับมา (c(duration, meanfreq, sd, median, Q25, Q75, IQR, skew, kurt, sp.ent, sfm, mode, centroid, peakf, meanfun, minfun, maxfun, meandom, mindom, maxdom, dfrange, modindx)) })) #เปลี่ยนชื่อผลลัพธ์ rownames(x) <- c("duration", "meanfreq", "sd", "median", "Q25", "Q75", "IQR", "skew", "kurt", "sp.ent", "sfm", "mode", "centroid", "peakf", "meanfun", "minfun", "maxfun", "ค่าเฉลี่ย", "mindom", "maxdom", "dfrange", "modindx") x <- data.frame(sound.files, selec, as.data.frame(t(x))) colnames(x)[1:2] <- c("sound.files", "selec") rownames(x) <- c(1:nrow(x)) return(x) }

processFolder <- ฟังก์ชั่น (ชื่อโฟลเดอร์) { # เริ่มต้นด้วย data.frame ที่ว่างเปล่า data <- data.frame() # รับรายการไฟล์ในโฟลเดอร์ list <- list.files(folderName, '\.wav') # เพิ่มรายการไฟล์ใน data.frame สำหรับการประมวลผล for (fileName in list) { row <- data.frame(fileName, 0, 0, 20) data <- rbind(data, row) } # ตั้งชื่อคอลัมน์ ชื่อ (ข้อมูล) <- c('sound.files', 'selec', 'start', 'end') # ย้ายไปยังโฟลเดอร์สำหรับการประมวลผล setwd (ชื่อโฟลเดอร์) # ประมวลผลไฟล์ อะคูสติก <- specan3(data, parallel=1) # ย้ายกลับไปที่โฟลเดอร์หลัก setwd('..') อะคูสติก }

เพศ <- ฟังก์ชั่น (filePath) { if (!exists ('genderBoosted')) { load ('model.bin') } # ตั้งค่าเส้นทาง currentPath <- getwd() fileName <- basename(filePath) path <- dirname(filePath) # ตั้งค่าไดเร็กทอรีเพื่ออ่านไฟล์ setwd (เส้นทาง) # เริ่มต้นด้วย data.frame ที่ว่างเปล่า data <- data.frame(fileName, 0, 0, 20) # ตั้งชื่อคอลัมน์ ชื่อ (ข้อมูล) <- c('sound.files', 'selec', 'start', 'end') # ประมวลผลไฟล์ อะคูสติก <- specan3(data, parallel=1) # Restore path. setwd(currentPath) ทำนาย (genderCombo, newdata=acoustics) }

# โหลดข้อมูล

การรั่วไหล <- processFolder('caminho para o pasta com Example de áudio com vazamento') without_leakage <- processFolder('caminho para o pasta com Example de áudio sem vazamento')

#ตั้งป้าย.

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

# ลบคอลัมน์ที่ไม่ได้ใช้

data$duration <- NULL data$sound.files <- NULL data$selec <- NULL data$peakf <- null

# ลบแถวที่มี NA

ข้อมูล <- data[complete.cases(data),]

# เขียนชุดข้อมูล csv

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

ขั้นตอนที่ 11: ทำซ้ำประสาท

Rede ประสาท
Rede ประสาท

A ideia do uso de uma rede neural, é a de realizar um reconhecimento automatizado através dos dados coletados pelo dispositivo de sensoriamento.

A rede neural utilizada é do tipo MLP (Multilayer Perceptron), este modelo é treinado com dados previamente identificados e após esse treinamento o modelo implantado no sistema conseguirá realizar a identificação ข้อมูลอัตโนมัติที่มีอยู่, ที่มีอยู่จริง

จำเป็นจริง ๆ uma filtragem dos dados de entrada, pois algumas características estavam diminuindo a taga de acerto da rede ao invés de melhora-la. Não foi realizado nenhuma abordagem estatística muito aprofundada, mas mesmo com um trabalho mais superficial pode-se chegar a algumas variáveis com bons desempenhos. เพิ่มเติม

Para os testes realizados o modelo obteve um desempenho muito bom, alcançando na maioria dos testes uma taxa de acerto de 100%, como pode ser observado na imagem anexa.

Este algoritmo é utilizado para treinar o modelo da rede e retornar แท็กซ่าเดอ acerto do mesmo ไม่มีระบบการทำงาน um algoritmo um pouco diferente seria usado, pois ele realizaria o treino ou receberia um modelo já treinado da nuvem ou de alguma outra fonte e com esse modelo realizaria as prediçites para cada.

# การเข้ารหัส: utf-8

นำเข้าแพนด้าเป็น pd

นำเข้า numpy เป็น np จาก sklearn.model_selection นำเข้า train_test_split เป็น tts จาก sklearn.neural_network นำเข้า MLPClassifier เป็น MLP จาก sklearn.metrics นำเข้าการจำแนกประเภท_report เป็น cr จาก sklearn.metrics นำเข้าความสับสน_matrix เป็น cm

# Leitura dos dados ทำ CSV

df = pd.read_csv('features.csv') # Separação das entradas df_X = df[df.columns[:len(df.columns)-1] # Filtrando เป็น 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 ประสาท

modelo = MLP(อัลฟา=0.0001, learning_rate_init=0.0001, hidden_layer_sizes=(50, 50, 50, 50), max_iter=10000, การเปิดใช้งาน='tanh', ตัวแก้ปัญหา='lbfgs')

#รุ่น Treinando

modelo.fit(X_train, Y_train) ผลลัพธ์ = 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") พิมพ์ (รายงาน)

แนะนำ: