[DSP] Reverse Sampler audio clipping

Pagina: 1
Acties:

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online
Even een korte introductie: ik heb een DSP algoritme geschreven dat realtime audio achteruit afspeelt, een reverse delay / sampler idee. Het algoritme werkt voor verschillende bufferlengtes (instelbaar), van één-tiende tot tien seconden. Op dit moment heb ik het algoritme volledig werkend en ik denk dat het vanuit technisch oogpunt correct geïmplementeerd is.

Het probleem is echter dat ik bij korte buffertijden hoorbare clipping / statische tikjes krijg op het moment dat een buffer is doorlopen. Dit begint ongeveer bij buffertijd kleiner dan 160 ms (frequentie van 6 Hz) en is beter hoorbaar bij zachte, afstervende passages in de inkomende audio.

Ik denk dat het probleem als volgt is, stel dat de inkomende audio-samples er als volgt uitzien:
code:
1
8 7 6 5 4 3 2 1

En mijn buffertijd is vier samples (voorbeeld op kleine schaal), dan wordt als "audio uit" het volgende gegenereerd:
code:
1
5 6 7 8 1 2 3 4

Ik denk dat de hoorbare clipping op dat moment wordt veroorzaakt door de overgang van sample met waarde 8 naar sample met waarde 1.

Mijn vraag is nu hoe ik dit het beste kan opvangen en hoe ik mijn samples moet combineren om de tikjes onhoorbaar te maken. Ik heb al geprobeerd om de samples op bufferscheidingen op te tellen en te delen door twee, maar dat maakt het tikken niet hoorbaar minder erg.

Ik hoop dat iemand kan aangeven welke techniek ik kan toepassen om de samples rond de bufferscheiding te combineren / bewerken voor een beter resultaat.

Remember, if you have any trouble you can always send a telegram to the Right People.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 11-02 08:33
Ik gebruik wel eens Adobe Audition, een geluidsbewerkings-programma, en daar kun je bijvoorbeeld samples knippen op 'zero crosses', momenten waar de amplitude door 0 gaat. Als je op die punten knipt heb je geen last van die tikken; nadeel is waarschijnlijk dat je samples fixed-length zijn...

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online
Ik heb ondertussen van alles geprobeerd, maar ik kom niet veel verder - er blijven consistent tikjes in het geluid zitten op het moment dat de buffer gewisseld wordt.

Heeft iemand misschien tips hoe ik met samples kan rekenen? Ik dacht dat gewoon optellen en delen zou werken, maar ik krijg het niet voor elkaar om samples te middelen en op elkaar aan te laten sluiten. In mijn code heb ik al het volgende geprobeerd:
code:
1
Float32 outSample = 0.5 * (oudeBufferEindSample + nieuweBufferBeginSample)

Maar dat lijkt geen sample op te leveren die in tussen de twee andere samples in ligt. Welke denkfout maak ik hierbij en welke regels gelden er dan *wel* voor het rekenen en middelen van samples?

Remember, if you have any trouble you can always send a telegram to the Right People.


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Erhm, als je binnenkomende sample-reeks er zo uitziet:

[8 7 6 5][4 3 2 1]

dan lijkt me dat de inverse daarvan dit is:

[1 2 3 4][5 6 7 8]

en niet:

[5 6 7 8][1 2 3 4]

of interpreteer ik de werking van je algoritme nu verkeerd?

[ Voor 3% gewijzigd door DroogKloot op 07-09-2006 23:42 ]


  • raoulduke
  • Registratie: Oktober 2003
  • Niet online
De werking van het algoritme is niet om de inverse van iedere sample te berekenen, maar om een stukje audio van een bepaalde lengte achterstevoren af te spelen. Dit wordt met een bepaalde frequentie gedaan, bijvoorbeeld één keer per seconde. Er wordt dan een audio buffer van een seconde opgeslagen en achterstevoren afgespeeld, terwijl de volgende buffer weer opgeslagen wordt om een seconde later afgespeeld te worden.

Het gaat dus om het inverteren van de positie van samples in plaats van de waarden zelf.

Remember, if you have any trouble you can always send a telegram to the Right People.


  • Henk007
  • Registratie: December 2003
  • Laatst online: 06-04-2025
raoulduke schreef op donderdag 07 september 2006 @ 22:11:
Ik heb ondertussen van alles geprobeerd, maar ik kom niet veel verder - er blijven consistent tikjes in het geluid zitten op het moment dat de buffer gewisseld wordt.

Heeft iemand misschien tips hoe ik met samples kan rekenen? Ik dacht dat gewoon optellen en delen zou werken, maar ik krijg het niet voor elkaar om samples te middelen en op elkaar aan te laten sluiten. In mijn code heb ik al het volgende geprobeerd:
code:
1
Float32 outSample = 0.5 * (oudeBufferEindSample + nieuweBufferBeginSample)

Maar dat lijkt geen sample op te leveren die in tussen de twee andere samples in ligt. Welke denkfout maak ik hierbij en welke regels gelden er dan *wel* voor het rekenen en middelen van samples?
Zoiets, maar dan iets uitgebreider. Maak er een crossfader van.
Laat dus de waarde alpha van 0.5 in bovenstaande code van 0 tot 1 lopen in bijvoorbeeld 100 stapjes:
code:
1
Float32 outSample = (alpha*oudeBuffersample[einde-100+i]+(1-alpha)*nieuweBuffersample[i])/2

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online
Henk007 schreef op vrijdag 08 september 2006 @ 01:10:
[...]

Zoiets, maar dan iets uitgebreider. Maak er een crossfader van.
Laat dus de waarde alpha van 0.5 in bovenstaande code van 0 tot 1 lopen in bijvoorbeeld 100 stapjes:
code:
1
Float32 outSample = (alpha*oudeBuffersample[einde-100+i]+(1-alpha)*nieuweBuffersample[i])/2
Ik heb het uiteindelijk werkend gekregen, er zat allereerst nog een bug in mijn andere code. Toen dat allemaal was opgelost was het crossfaden inderdaad de juiste oplossing, let er wel op dat je zoals jij aangeeft niet door 2 moet delen omdat de alpha factor van 0 tot 1 loopt.

Remember, if you have any trouble you can always send a telegram to the Right People.

Pagina: 1