Olá Comunidade!
Eu queria mexer com o microcontrolador novamente e fazer algo útil. O objetivo foi formado quase imediatamente, porque algo me incomodou no apartamento.
Como você sabe, uma mesa de computador é uma mesa de jantar para assistir Drobyshevsky ou ler Giktayms / Green Cat / etc. ao mesmo tempo que o jantar. Mas há um problema - eu costumo sair da cozinha com as
duas mãos ocupadas e voltar
também ,
porque os copos são empilhados em três pedaços. Ligue e desligue a luz na cozinha (interruptor triplo - cozinha / banheiro / vaso sanitário) é o ombro, nariz, dedo mindinho. Ou seja, é inconveniente de qualquer forma, mas é impossível reorganizá-lo. Havia uma tarefa para gerenciar de alguma maneira remotamente.
Todos os sensores de presença e passagem foram imediatamente descartados - não com precisão, não há controle pela vontade do proprietário. A solução é encontrada no controle de som, voz. Eu direi imediatamente que não planejei fazer reconhecimento de fala, isso não é necessário aqui. A luz ligada pelo pop foi descrita na Rádio 80, mas eu não queria fazer isso. Acabou um tipo de viva-voz quando as mãos estão ocupadas. Os detalhes estão ativados.
Peça de hardware.
Havia uma placa com Atmega32 com quartzo e periféricos
SEM0007M-32A e uma dispersão de componentes eletrônicos.
Havia um microfone e um amplificador operacional. Para a saída, há um transistor em um pacote sot32 na placa, há também um relé de 7 amp. Tudo é montado em uma caixa para cartões de visita, o relé é paralelo ao interruptor, o microfone está escondido embaixo da tomada. O esquema é comum, eu nem o desenhei. Apenas uma entrada analógica e uma saída MK discreta são usadas. O SEM é redundante, mas, por enquanto, deixe estar.
Placa e fios desmontados. Então ele refez com mais precisão.O interruptor em si, o microfone não é visível sob a tomada desmontada.Procure um algoritmo.
Objetivo: o sensor deve responder a uma palavra, por exemplo, “
luz! »Com um mínimo de código.
Tarefa: identifique a palavra de comando no contexto de possíveis ruídos, batidas e cliques com a mesma opção. Ou seja, apenas a análise de amplitude não é adequada e a análise espectral mostrou que há muitos harmônicos na palavra e, é claro, eles mudam. Portanto, era necessário procurar uma solução simples, mas com imunidade a ruídos aceitável. Você pode fazer vários filtros de frequência e uma comparação com uma amostra da palavra, mas não precisa lidar com o reconhecimento. Foi decidido analisar a presença de apenas um som de vogal, por exemplo, o som "E" ou "E".
O som é "E". Muitos harmônicos são visíveis, por isso a análise é difícil.O som é "A." O espectro parece mais limpo, há uma frequência principal.Parte do software
Para conhecer os componentes espectrais do sinal, você pode usar filtros digitais. Existe um
bom programa na Internet
para criar filtros FIR e IIR digitais e calcular seus coeficientes - é claro lá e o código C é gerado automaticamente.
Mas eu recusei filtros digitaisPara uma filtragem aceitável (4 ou mais pedidos), muitos coeficientes foram obtidos e até um flutuador. Assim, além de todos os cálculos de filtro no flutuador:
float ACoef[NCoef+1] = { 0.00000347268864059354, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00002083613184356122, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00000347268864059354 }; float BCoef[NCoef+1] = { 1.00000000000000000000, -7.09708794063733790000, 22.77454294680684300000, -43.03321836036351300000, 52.29813665034108500000, -41.84199842886619100000, 21.53121088556695300000, -6.52398963450972500000, 0.89383378261285684000 };
O microcontrolador pode ter lidado com isso, mas haveria problemas com a depuração - não é fácil ultrapassar os limites do filtro - esses são novos coeficientes a serem calculados.
Após algumas pesquisas, decidi on-line a transformada de Fourier de frequência única. Ou seja, a clássica transformada de Fourier discreta, realizada na chegada de cada amostra do sinal com uma frequência de amostragem (1600 Hz), não há passagem pelas frequências, existe apenas uma frequência, por isso é fácil configurá-lo via RS-232 durante o comissionamento. Como resultado, a análise foi realizada para uma frequência de 128 Hz.
Devido a amostras curtas (blocos) e uma janela retangular, a resolução de frequência é baixa, o que fornece sensibilidade seletiva na faixa de 114 ... 140 Hz,
e esse é o filtro P que eu queria obter.Primeiro você precisa entender onde o sinal de comando de voz começa a
gritar . Para isso, primeiro é calculado um nível de sinal zero, através da
suavização exponencial com uma constante de suavização 1/64. O código está abaixo.
Parte do código do temporizador para processamento de sinal. Frequência do temporizador 1600 HzO sinal normaliza para a média. Para determinar o nível de intensidade do som, os valores absolutos do sinal também são calculados com uma constante de 1/16, para a filtragem passa-alta de meias ondas de sinal individuais (este é um análogo do RMS, mas mais fácil de calcular). Exceder esse nível acima do limite é o início de um comando de voz e é iniciada uma análise sequencial de 5 blocos de 135 amostras (84,3 ms).
A figura abaixo mostra o sinal, nível do sinal, limite e 5 blocos.
Proteção contra interferência
O sinal é dividido em blocos para proteger contra um impulso - um clique ou uma batida. O pulso, como você sabe, tem uma resposta de frequência uniforme, ou seja, em qualquer banda de frequência, haverá um resultado diferente de zero e provavelmente acima do limite. Mas o
cabelo é longo, mas o impulso
da mente é curto. Ou seja, não haverá mais pulso no próximo bloco, o que significa que o nível na banda de frequência estará abaixo do limite. Simultaneamente com essa vantagem, os blocos curtos fornecem uma
baixa resolução em frequência. Portanto, algumas diferenças de frequência no sinal ainda caem na linha de frequência selecionada.
Conversão de frequência
Em cada bloco, uma transformada de Fourier de frequência única é realizada para uma frequência f.
Tradicionalmente, para acelerar os cálculos, as funções sin e cos são tabuladas e redimensionadas para -127 .. + 127.
O índice
si(ps)
matriz
si(ps)
é calculado a partir do argumento sin (2 * π * f * t / T), é claro, com um loopback dentro do mesmo período. O índice de
pc
para cos (2 * π * f * t / T) é simplesmente empurrado 12 posições para a frente na mesma matriz
si
.
Resultado
Y - o nível da linha espectral é obtido como a soma dos valores absolutos das partes reais e imaginárias durante um bloco.
Entãoda maneira certa, você precisa fazer a soma dos quadrados e da raiz, mas isso é terrível para um MK de 8 bits.
No mesmo timer: a_si = (long int) (a * si[ps]) >> 4;
No final de cada bloco,
Y é comparado com um limite, é calculado o número de blocos que excede os blocos acionados pelo limite. Após os experimentos, verificou-se que o número mínimo de blocos acionados é 3 em 5.
Um exemplo de intensidade espectral em blocos com um comando de voz. A equipe já passou.Três ou mais blocos acionados são interpretados como um comando recebido corretamente. O sinal na saída discreta do MK é invertido, acendendo ou apagando a luz. Como toda a análise ocorre dentro dos blocos, não há atraso na operação após o último bloco.
O tempo de computação é de aproximadamente 1600 ciclos, o temporizador é chamado a cada 9000 ciclos, portanto a carga do MK é baixa - há espaço para novas experiências com reconhecimento. Ou você pode fazer uma solução completa de tamanhos menores e em um MK fraco.
A correção dos algoritmos foi controlada através da troca de variáveis necessárias (log) via RS-232 com o programa VBasic. A frequência f e os limites são armazenados no eeprom.
Como resultado: o sensor mostrou-se muito conveniente, responde às palavras de "
A ", por exemplo,
" Waaau ", " Taaam ", " Laite ", " Miaaa ", " Yao-Yao " . O volume é comum para conversas humanas. A palavra "
Lit " teimosamente se recusa a ouvir. Cliques, batendo nas portas, degraus, derramando água ignora. Agora você pode andar com as mãos cheias de copos e pratos)).