Stap 4: automatische synchronisatie – poging 2

Zoals André al suggereerde (zie zijn commentaar op de voorstudie), lijkt het straightforward om naast het videokanaal van de DV camera, ook het audiokanaal te gebruiken.  Op dit audiokanaal moeten we dan een signaal geven, telkens de film 1 beeldje vooruitgetrokken wordt.

Dit principe is inderdaad veel eenvoudiger, maar de DirectShow filter ontwikkeling hiervoor is wel een stuk complexer... want hiervoor moet ik een filter schrijven die zowel audio als video inputs heeft.  Een kant en klaar voorbeeld is hiervoor niet beschikbaar. (De EZRGB24 was veel makkelijker, het framework voor de filter met een video input en output was al beschikbaar.)

Om het audiosignaal te genereren, is eerst nog wat knutselwerk aan de filmprojector nodig.  Hoe genereren we een audiosignaal, telkens het beeld vooruit getrokken wordt?

Een aantal benaderingen:

  • Een optische sluis maken, die detecteert wanneer de ene overblijvende vinger van het vlinderwiel voorbijkomt.
  • Of, een metaaldetector maken, die diezelfde vinger van het vlinderwiel detecteert.
  • Of, een mechanische opstelling waarbij we de vinger van het vlinderwiel laten tikken tegen een microfoontje ?

Deze laatste benadering leek me het eenvoudigst.  Maar welke microfoon kunnen we hiervoor gebruiken?

Ik kwam op het idee om geen microfoon, maar een luidsprekertje te gebruiken als microfoon.  Uiteindelijk is een luidspreker op exact hetzelfde principe gebaseerd als een dynamische microfoon: een spoel die zich binnen een statische magneet beweegt.  Ofwel zet de spoel beweging om in een elektrische stroom (= microfoon), ofwel zet de spoel electrische stroom om in beweging (= luidspreker).

Een klein luidsprekertje uit een oude computerkast kon hier goed dienst voor doen.  Ik soldeerde er een stereo-minidin-kabeltje aan dat in de microfooningang van mijn camera past – en inderdaad, als ik tegen de luidspreker tik, krijg ik een duidelijk signaal op de audio ingang.  Als we dit 16-bit samplen, moet dit bruikbaar zijn.

De montage in de projector was nog wat knutselwerk.  Uiteindelijk gebruikte ik een stukje plastic mica-folie, in een kokertje gerold, dat ik met secondelijm aan de luidspreker plakte.  De vinger van het vlinderwiel tikt telkens tegen dit mica-kokertje, dat de tik doorgeeft aan de spoel.

 

Om de gecombineerde audio+video stream te processen op de computer, is een nieuwe DirectShow filter nodig.

Omdat ik nog geen ervaring had met audio-processing, baseerde ik me op een ander DirectShow voorbeeld: de Scope filter.  Dit is een voorbeeldje met 1 enkele audio input pin, dat de audio waveform tekent in een window.

Gebaseerd op de scope filter bouwde ik een nieuwe DirectShow filter: de framecapture filter.  Hiervoor moest ik 2 pinnen toevoegen: een video input pin, en een video output pin (voor preview).

Een stuk van de code voor de videoprocessing kon ik overnemen van wat ik al in de vorige poging maakte (gebaseerd op EZRGB24): de JPG file uitvoer, de multithreading, ...

Nu moet nog 1 horde genomen worden: hoe detecteren we de audiopulsen ?

Eenvoudigste methode = puls gedetecteerd zodra het audio level over een bepaalde treshold gaat.  Dit kunnen we combineren met een “holdoff” periode na de trigger, zoals we op een gewone oscilloscoop vinden.

Om dit mooi te laten werken, was nog 1 extra stap nodig.  Het binnenkomende audiosignaal, gesampled aan 48kHz / 16bit, is nog te “vuil”.  Er zit hoogfrekwent ruis op, en er worden te veel pieken gedetecteerd.  Het moet opgekuist worden.

Makkelijkste manier hiervoor = laagdoorlaat filteren.  Dit kunnen we met wat electronica doen, maar dat kunnen we ook in software doen, met een FIR filter.

De filter coëfficiënten kan je makkelijk berekenen op http://arc.id.au/FilterDesign.html .  Ik gebruikte de volgende parameters voor een band pass filter: 48kHz, 201 tabs, Fa=100Hz, Fb=500Hz, att 100dB.  Dit leverde voldoende verbetering op van het audiosignaal, om proper te kunnen triggeren op de pieken.

Nu kunnen we spelen met 3 parameters: de treshold, de holdoff en de sample delay, om het capturen van de beeldjes te sturen!