WaveWizard

Bewerk signaal (1)

Bewerk signaal (1)

De functie Bewerk signaal is een van de simpelste en meest veelzijdige functies van WaveWizard.
In deze en volgende posts enkele voorbeelden, ontleend aan recente forumdiscussies.

Zangstem verwijderen uit stereo-signaal is iets dat vaak gevraagd wordt (karaoke e.d., zie bijvoorbeeld https://www.synthforum.nl/forums/showthread.php?t=178059.

Dat is mogelijk als de zang op beide sporen identiek is en op het ene spoor gemixed is met instrumentgroep A en op het andere met instrumentgroep B. Je hebt dan dus:

Spoor S1 = zang + A
Spoor S2 = zang + B

Als je S1 aftrekt van S2 elimineer je de zang, want:

S2 - S1 = (zang + B) - (zang + A) = B - A.


Code:
Bewerk signaal
  n0          0
  n1          WAV_lengte
  Bewerking   S3[n] = S2[n] - S1[n]
 
Laatst gewijzigd:
Hallo Roland,
de trekvogel is er weer...;), een paar rustige maanden breken aan.

Inderdaad: de formulevorm legt kort en bondig uit wat er gebeurt. Korter en bondiger kan niet.
Ik moet nu weer denken aan de vraag die ik Jaap van Eik, hoofdredacteur indertijd van Music Maker, stelde tijdens de voorbespreking van de 15-delige serie over DSP die ik voor het blad zou gaan maken (en die ook inderdaad verscheen in 2000-01): "Vind je het goed als ik hier en daar een klein formuultje in de tekst plaats?" Jaap verschoot van kleur: "zeg, wil je m'n blad om zeep helpen?"

Music Maker werd inderdaad om zeep geholpen, enkele jaren later. Maar niet door Jaap. En ook niet door formules...
 
Bewerk signaal (2): DC-component verwijderen

Bewerk signaal (2): DC-component verwijderen

fatclap's draad faseverschil? gaat over de DC-component die soms in een signaal zit, en natuurlijk de vraag hoe je die eruit haalt. Mijn antwoord heb ik gegeven in https://www.synthforum.nl/forums/showpost.php?p=1731690&postcount=28 e.v. Hier de WaveWizard code. Er moeten twee dingen gebeuren:

stap 1:
Alle samples bij elkaar optellen en de som delen door het aantal samples.
Dan heb je de gemiddelde uitwijking.

F1[0] is de naam van een register waarin de uitkomst wordt opgeslagen.
WAV_lengte is ook een register, waarin het aantal samples wordt opgeslagen van het wav-bestand dat is geopend.

Code:
F1[0] = 0 

Bewerk signaal
  n0          0
  n1          WAV_lengte
  Bewerking   F1[0] = F1[0] + S1[n] 

gemiddelde = F1[0] / WAV_lengte

Wat hier in feite gebeurt is de berekening van de 'nulde' spectraallijn.
Het is dus een onderdeel van de Fourieranalyse, zoals die o.a. door de FFT wordt uitgevoerd.

stap 2:
Dat gemiddelde trek je af van elke sample.
Daarmee is het gemiddelde nul geworden en is de DC-component (de 0 Hz-component) verwijderd:

Code:
Bewerk signaal
  n0          0
  n1          WAV_lengte
  Bewerking   S1[n] = S1[n] - gemiddelde

In het eerste code blok wordt 'Bewerk signaal' gebruikt als signaal-analyzer.
Het tweede blok is een bewerking 'op maat' die gebaseerd is op die analyse .
Dit is de beste methode, want er kunnen geen klankvervormingen optreden.
 
Bewerk signaal (3): zaag octaveren of veranderen in blokgolf

Bewerk signaal (3): zaag octaveren of veranderen in blokgolf

Dat "geheime" zou ik dan eerder willen halen uit een iets latere post van jou in diezelfde draad; ook dat is een leuk voorbeeld van wat je met 'Bewerk signaal' kunt realiseren:

Roland Kuit in https://www.synthforum.nl/forums/showpost.php?p=1711136&postcount=13:

Dat uitdoven door een tegenfase daar kun je mee variëren.
We pakken er weer een Delay module bij. Nu gebruiken we een mixer zonder inverter.
Wel tellen we de signalen op. Het directe signaal(zaagtand) en de vertraagde zaagtand.
Wanneer de knob "Phase" precies tot op deze hoogte wordt opengedraaid hoor je het signaal 1 octaaf hoger.
Je kunt dit niet een 'octavider' (FX) noemen. Wel gaat dit meer richting filteren.
Dus door meerdere fases op te tellen of af te trekken kleur je het signaal.


Code:
Declareer f; Delay; duur

f     = frequentie van zaagtand
Delay = Fs/(2*f)
duur  = ...  

Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S2[n] = S1[n] + S1[n-Delay]

Overigens is hierin sprake van uitdoving niet tengevolge van een aftrekking zoals in #542, maar van een optelling (want je gebruikt hier de inverter niet). Als je het plusteken in de code vervangt door een minteken, ontstaat een blokgolf van dezelfde frequentie als de zaag. Dat laatste geeft een aardige kijk op het gedrag van de amplitudekarakteristiek van het niet-recursieve kamfilter y[n] = x[n] + a*x[n-Delay], voor a = +1 of -1.

attachment.php
 

Attachments

  • Amplitudekarakteristiek_kamfilter.jpg
    Amplitudekarakteristiek_kamfilter.jpg
    52,3 KB · Bekeken: 98
Code:
Declareer f; Delay; duur

f     = frequentie van zaagtand
Delay = Fs/(2*f)
duur  = ...  

Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S2[n] = S1[n] + S1[n-Delay]
Overigens is hierin sprake van uitdoving niet tengevolge van een aftrekking zoals in #542, maar van een optelling (want je gebruikt hier de inverter niet). Als je het plusteken in de code vervangt door een minteken, ontstaat een blokgolf van dezelfde frequentie als de zaag. Dat laatste geeft een aardige kijk op het gedrag van de amplitudekarakteristiek van het niet-recursieve kamfilter y[n] = x[n] + a*x[n-Delay], voor a = +1 of -1.

Deze had ik al eens gezien in je verhandeling over nagalm?
 
Bewerk signaal (4): DC-component verwijderen alternatief

Bewerk signaal (4): DC-component verwijderen alternatief

Je kunt de DC-component ook weghalen door een bewerking zonder voorafgaande analyse.
Bijvoorbeeld d.m.v. een eerste orde Notch-filter die 0 Hz volledig onderdrukt.
Ook dat kan met 'Bewerk signaal':

Code:
a = 0,9
Bewerk signaal
  n0          0
  n1          WAV_lengte
  Bewerking   S2[n] = S1[n] - S1[n-1] + a*S2[n-1]

Deze laatste methode is wel korter, maar je betaalt de prijs van òfwel vervorming van lage tonen òfwel een lange transiënt. Die keuze maak je door de instelling van de waarde van a (wel altijd > 0 en < 1).
 
Was het misschien https://www.synthforum.nl/forums/showpost.php?p=1568994&postcount=375?

Dat vertoont idd grote overeenkomsten met het kamfilter. Maar er is ook een groot verschil, nl. nou net die ene plaats, de "hoofdlob", waar een boventoon wèl wordt doorgelaten.

Voor zo'n Fourier-sinusfilter is een heleboel meer rekenwerk nodig: meestal honderden of zelfs duizenden optellingen en vermenigvuldigingen, terwijl voor het kamfilter slechts één optelling en één vermenigvuldiging nodig zijn, zie codeblok in #547: S2[n] = S1[n] + S1[n-Delay].
 
Laatst gewijzigd:
Bewerk signaal (5): echo-feedback, Escher, unrealizability

Bewerk signaal (5): echo-feedback, Escher, unrealizability

Aanhakend jouw post #17 van draad Synthese met fase verschuiving:
https://www.synthforum.nl/forums/showpost.php?p=1711293&postcount=17

Feedback is het terugrouten van een signaal en dat kan op verschillende manieren.
Direct terug, omgekeerd direct terug, direct terug met fase verschil en direct terug met fase verschil.

Door gebruik te maken van de Delay module (AllPass filter) en die terug te routen creëer je eigenlijk een soort 'doosje' waarin, in dit geval, audio rondcirkelt.

Ik zet jouw Vier Gevallen nog eens op een rij:
(1) direct terug,
(2) omgekeerd direct terug,
(3) direct terug met fase verschil en
(4) direct terug met fase verschil.

Het gaat hier over Nord Modular, dus over software die tot doel heeft om zo goed mogelijk de look and feel te geven van een analoog modulair synthesesysteem. Maar software is en blijft software, dus intern wordt gewerkt met discrete signalen, d.w.z. signalen die gerepresenteerd worden door getallen. Alle signaalbewerkingen die de modules uitvoeren zijn niets anders dan berekeningen. We hebben het dus over Digitale Signaalverwerking: DSP. En juist als het gaat om feedback is het belangrijk om je dat goed te realiseren, want in de gevallen (1) en (2) (dus "direct terug" en "omgekeerd direct terug") stuiten we op een een fundamenteel probleem!

Ook hier zien we een prachtig voorbeeld hoe verhelderend een formule kan werken.
Neem eens de uitdrukking:

a = a + 1

Die kun je op twee verschillende manieren interpreteren:

(1)
als wiskundige vergelijking. Dat is een uitdrukking waarin iets wordt beweerd, nl. dat wat links van het = teken staat gelijk is aan wat rechts staat. Het zal duidelijk zijn dat de bewering a = a + 1 onwaar is, immers een getal kan niet gelijk zijn aan zichzelf plus 1.

(2)
als computertaal-expressie zul je de uitdrukking a = a + 1 prima kunnen tegenkomen in Basic, C, Fortran, en alle andere imperatieve talen, ook in WaveWizard. En dat levert geen enkel probleem op want in computertalen is de uitdrukking a = a + 1 geen bewering, maar een commando, nl. de toewijzing: "tel bij het getal dat in register a staat 1 op en sla de uitkomst vervolgens weer op in register a".

Daarom kun je in WaveWizard gerust schrijven:

Code:
Bewerk signaal
  n0          0
  n1          1000
  Bewerking   S1[n] = S1[n] + 1

Dit heeft tot resultaat dat bij de eerste 1001 samples van spoor S1 het getal 1 wordt opgeteld. Niks aan de hand. Maar hoe zit het nu met feedback in de vormen (1) en (2), "direct terug" en "omgekeerd direct terug"?

Als we bij analoog de output van een module via een kabel verbinden met z'n eigen input, doen we iets dat heel verrassende resultaten kan hebben, maar dat, hoe dan ook, in principe altijd realiseerbaar is. Maar als we een analoge module in computervorm willen gieten, dan krijgen we precies die onmogelijke situatie van a = a + 1 in de wiskundige betekenis! Want we willen een bewerking doen waarbij we het resultaat van de bewerking nodig hebben in de bewerking zelf! Dat doet denken aan die plaatjes van Escher, waarin monniken oneindig lang een trap op- of aflopen zonder ooit boven of beneden te komen. In DSP-literatuur spreken ze dan van unrealizability. Een bekend voorbeeld daarvan is de discretisering van het Moog-filter.

Hoe moeten we dat probleem oplossen?

(wordt vervolgd)

attachment.php
 

Attachments

  • EscherOmhoogOmlaag.jpg
    EscherOmhoogOmlaag.jpg
    140,5 KB · Bekeken: 98
Ik zet jouw Vier Gevallen nog eens op een rij:
(1) direct terug,
(2) omgekeerd direct terug,
(3) direct terug met fase verschil en
(4) direct terug met fase verschil.

Bedoel je niet:

(4) Direct terug, omgekeerd met fase verschil

?? of zit er een fase verschil tussen die 2 zinnen :)
 
Bedoel je niet:

(4) Direct terug, omgekeerd met fase verschil

?? of zit er een fase verschil tussen die 2 zinnen :)

Oeps drukfout!
Moet zijn:
(4) omgekeerd direct terug met fase verschil

thx!
 
Bedankt.
Ik ben bekend met deze 4.
Analoog gebruiken we signal processors en voor omkering en delay voor fase.
Maar ook kunnen we een level-adder in de terugrouting stoppen.
Jouw DC post ging over het verwijderen.
Omgekeerd lijkt mij in WW ook te kunnen.
Het juist toevoegen in het doosjes verhaal.(dit terzijde).

Als antwoord op jouw laatste vraag denk ik een 1-sample delay.
Door deze vertaging kan het proces weer opniew beginnen vanuit een ander startpunt.

En ja, het is Monnikenwerk :)
 
Als antwoord op jouw laatste vraag denk ik een 1-sample delay.
Door deze vertaging kan het proces weer opniew beginnen vanuit een ander startpunt.
idd daar dacht ik ook aan, een getal (zo ver mogelijk) achter de komma bijv.

als je met een analoge synth een kabel in zichzelf steekt, hoe kort die ook is, is er alleen daardoor al 0,000...1 vertraging lijkt me. Zou het daarom zijn dat je ook in de wiskundige formule 'vastloopt' omdat het ook de werkelijkheid niet kan zijn? (precies 1-op-1) Dan wordt het a = 'bijn-a' +/- 1
 
Delay-Feedbackformule

Delay-Feedbackformule

Roland:
Als antwoord op jouw laatste vraag denk ik een 1-sample delay.
Door deze vertaging kan het proces weer opniew beginnen vanuit een ander startpunt.

Sander:
idd daar dacht ik ook aan, een getal (zo ver mogelijk) achter de komma bijv.

Ja, de oplossing waar het hier om draait is inderdaad dat je ervoor zorgt dat er geen zg. delay-free loop ontstaat, m.a.w. geen lus met een oneindig korte delaylijn en die moet daarom tenminste 1 sample bevatten. Dus "direct terug" (#554) betekent dan: "met de allerkortste delay" van 1 sample = 1 / Fs sec. (Fs is de sampling frequentie in Hz).
Bijv. werkt software met een samplingfrequentie van 44.1 kHz (zoals CD en WaveWizard), dan is die kortste delay dus 1/44100 sec = 22,7 microseconde.

Nu kunnen we dus de 4 Nord Modular-routes die Roland noemde vertalen in formules. Daarbij is het handig om de input- en outputsignalen herkenbare namen te geven:
het inputsignaal noemen we In[n];
het outputsignaal noemen we Out[n];

Code:
(1) direct terug:                    Out[n] = In[n] + Out[n-1]                                                  
(2) omgekeerd direct terug:          Out[n] = In[n] - Out[n-1]
(3) direct terug met fase verschil:  Out[n] = In[n] + Out[n-N]
(4) direct terug met fase verschil:  Out[n] = In[n] - Out[n-N]

in (3) en (4) is N de delaytijd uitgedrukt in samples;
als delaytijd gelijk is aan t sec dan is N = t*Fs samples (Fs is de samplingfrequentie).

Uiteraard zul je in de Nord Modular binnen de feedbacklus een verzwakker (natuurlijk geen versterker) kunnen opnemen. Noemen we die verzwakker a, dan kunnen we de vier formules hierboven vervangen door één enkele. Die zou je de Delay-Feedbackformule kunnen noemen:

Code:
Delay-Feedbackformule:

     Out[n] = In[n] + a*Out[n-N]                                                  

Hierin moet gelden:
|a| < 1; 
de delaytijd N is een positief geheel getal;
Out[n] = 0 voor n < 0.
 
Back
Top