Page 1 of 1
Aliaser
Posted: Mon Dec 13, 2010 6:01 pm
by frank
Some aliaser code I was working on for a new module program set but decided to share instead. Free to use in private and commercial pedals as long as you mention code (or original code if you mod it) was from OCT Distribution.
Code: Select all
; aliaser.spn
; Frank Thomson
; OCT Distribution
; (c) 2010 OCT Distribution
;
; Input: Left
; Output: Left
; POT0 : set "sample" rate
; POT 1 and POT2 not used
;
old equ reg0
new equ reg1
fptr equ reg2
temp equ reg3
temp2 equ reg4
ptrmax equ 1.1; High sample rate, need to be just over 1.0 if we want no aliasing at high setting.
ptrmin equ 0.001; Low sample rate
skp run, start
clr
wrax old,0
wrax new,0
wrax fptr,0
start:
clr
rdax pot0,0.5
sof ptrmax-ptrmin,ptrmin
rdax fptr,1
wrax fptr,1
sof 1,-0.5
skp neg,interp
wrax fptr,0
rdax new,1
wrax old,0
rdax adcl,1.0
wrax new,0
interp:
clr
rdax new,1.0
mulx fptr
wrax temp,1
rdax temp,1
wrax temp,0
rdax fptr,-1.0
sof 1.0,0.5
wrax temp2,0
rdax old,1
mulx temp2
wrax temp2,1
rdax temp2,1
rdax temp,1.0
wrax temp2,1
absa
wrax temp,0
;
rdax temp2,1.0
skp gez, gogo
clr
rdax temp,1.0
sof -1.0,0
wrax temp,0
gogo:
clr
rdax temp,1.0
wrax dacl,1.0
wrax dacr,0
Posted: Tue Dec 14, 2010 7:41 am
by Alex MAK
Frank, thank you for the code! He is very good;). But there is one observation. The effect is regulated very strongly at the beginning of the scale, and is not regulated further. Possible that the effect was regulated by full scale evenly?
Posted: Tue Dec 14, 2010 10:05 am
by frank
Depending on the audio source (i.e. guitar) you may want to lower the value of ptrmax to something like 0.5 since a guitars range is only about 80Hz to 1.4KHz so you can lower the top sample rate much lower (even down to 0.25 may work OK) Just play with the value of ptrmax.
Posted: Tue Dec 14, 2010 1:12 pm
by Alex MAK
Frank, thank you! Works as expected:). How to make "robot voice" was brighter against the background of pure guitar?
Posted: Tue Dec 14, 2010 4:06 pm
by frank
Alex MAK wrote:Frank, thank you! Works as expected:). How to make "robot voice" was brighter against the background of pure guitar?
The ring modulator would do better at a robot type voice, this does frequency aliasing due to intentional under sampling.
Posted: Fri Mar 18, 2011 12:46 pm
by soundsubs
...would love to see this brought up again.
specifically, id like to reduce sample frequency rate and then bit depth after that. is this possible with the fv-1?
Posted: Fri Mar 18, 2011 2:23 pm
by frank
Just use an AND mask to limit bits.
Posted: Tue Apr 09, 2013 7:38 am
by Sweetalk
This code is great, any explanation on the algoritm?.
Posted: Tue Apr 09, 2013 9:13 am
by frank
Sweetalk wrote:This code is great, any explanation on the algoritm?.
It's been a long time since I wrote the code but basically I just use a counter to decide when to generate a sample. When I do generate a sample I interpolate between the latest ADC samples to create the final value.
Re: Aliaser
Posted: Mon Oct 11, 2021 10:33 am
by Sweetalk
Bringing up an old thread!. I was looking at this code and can't get my head around the interpolation portion. I understand that between the pot and fptr you decide to take a new sample or not, but not how is interpolated to "fill the holes" between samples. Any thoughs? Maybe I'm missing something
Re: Aliaser
Posted: Mon Oct 11, 2021 5:37 pm
by frank
Well it has almost been 11 years since I wrote this but it looks like I am using fptr as an interpolation coefficient since it is updated every real sample period.
Re: Aliaser
Posted: Tue Oct 12, 2021 2:32 am
by Sweetalk
frank wrote: ↑Mon Oct 11, 2021 5:37 pm
Well it has almost been 11 years since I wrote this but it looks like I am using fptr as an interpolation coefficient since it is updated every real sample period.
Yeah Frank, a long time, sorry to bring it up. Took me 9 years to check it out and read the code line by line
.
I drew a block diagram of the code to see what it does. There are some bits that confuses me, for example:
Code: Select all
rdax new,1.0
mulx fptr
wrax temp,1
rdax temp,1
wrax temp,0
This is the begining of the interpolation part. You take the new sample, multiply it by fptr (interpolation coefficient) and save it to temp. So far so good. But you keep that on the acc and then add it again to temp. You're adding the new sample adjusted by the coef to itself, why?. You do that on the old sample as well with temp2.
Re: Aliaser
Posted: Tue Oct 12, 2021 10:58 am
by frank
I would have to take time to really break it down but off the top of my head, when you do interpolations the base equation is:
A*x + B*(1-x)
Where x is the interpolation coefficient, but you can change the equation to:
A*x + B -B*x
or
(A-B)*x + B
which can be easier to code in some cases, no need for a "1.0", only 1 multiply, etc.
Re: Aliaser
Posted: Thu Oct 14, 2021 2:37 am
by Sweetalk
Well, I finally got it sorted out. Ran a desk test, pen and paper and looked the evolution of the registers. fptr generates the "virtual clock" that takes samples and manages the interpolation part. It's a bit different from other algos with interpolation but it does the job really well.
With the temp register you make the interpolation part for the new sample. And then you use it again to save the absolute value of the interpolated signal.
The temp2 register acts first as the interpolation coeffiecient for the old sample and to save it once adjusted to that coefficient. Finnaly you save the final interpolated sample on it.
I'm curious about why you took the absa on the temp register. Then you check the sign of temp2 (with the interpolated sample) and flip the sign of temp (that got the absolute value of the inteprolated sample) to get the correct sign. Why don't use temp2 directly?
Re: Aliaser
Posted: Thu Oct 14, 2021 8:53 am
by frank
Sweetalk wrote: ↑Thu Oct 14, 2021 2:37 am
I'm curious about why you took the absa on the temp register. Then you check the sign of temp2 (with the interpolated sample) and flip the sign of temp (that got the absolute value of the inteprolated sample) to get the correct sign. Why don't use temp2 directly?
No idea, it was 11 years ago so it may have been something left over from another idea, etc.