windowing formulas/agorithms?

Mar 22, 2007 at 11:42pm

windowing formulas/agorithms?

Hi all,

Can anyone point me to a good source (preferably online) for formulas/
algorithms for generating the “standard” windowing functions (i.e.
gaussian, hanning, blackman, kaiser, etc.) of 512, 1024, etc. points?
I’d like to create some ‘roll-your-own’ abstractions for generating
windows and storing them in buffers. I know a few people have already
implemented these kinds of things in MaxMSP; I’d like to go through
the learning curve of making my own. I plan to use them for a variety
of things, starting with granularization of sound files.

Thanks in advance,

Best,

Steven

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#30978
Mar 23, 2007 at 12:10am

Hi Steven,

Wikipedia has formulae for a lot of them:

http://en.wikipedia.org/wiki/Window_function


Owen

Steven Miller wrote:
> Hi all,
>
> Can anyone point me to a good source (preferably online) for
> formulas/algorithms for generating the “standard” windowing functions
> (i.e. gaussian, hanning, blackman, kaiser, etc.) of 512, 1024, etc.
> points? I’d like to create some ‘roll-your-own’ abstractions for
> generating windows and storing them in buffers. I know a few people have
> already implemented these kinds of things in MaxMSP; I’d like to go
> through the learning curve of making my own. I plan to use them for a
> variety of things, starting with granularization of sound files.
>
> Thanks in advance,
>
> Best,
>
> Steven
>

#99766
Mar 23, 2007 at 12:31am

On Mar 22, 2007, at 7:42 PM, Steven Miller wrote:
> I know a few people have already implemented these kinds of things
> in MaxMSP; I’d like to go through the learning curve of making my
> own. I plan to use them for a variety of things, starting with
> granularization of sound files.

Steven:
I have a patch that demonstrates how to do this in the GTK. If you
download the toolkit from the URL below, look in the extras folder
for a patch called “gtk.winMaker”. This in the actual patch used to
create all the window files used by the toolkit.

Or am I one of those “few people” to which you refer? :)

–Nathan

——————-
Nathan Wolek, PhD — nwolek@stetson.edu
Assistant Professor of Music Technology
Stetson University – DeLand, FL

http://www.nathanwolek.com

#99767
Mar 23, 2007 at 12:59am

http://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html

On 3/22/07, Steven Miller wrote:
> Hi all,
>
> Can anyone point me to a good source (preferably online) for
> formulas/algorithms for generating the “standard” windowing functions (i.e.
> gaussian, hanning, blackman, kaiser, etc.) of 512, 1024, etc. points? I’d
> like to create some ‘roll-your-own’ abstractions for generating windows and
> storing them in buffers. I know a few people have already implemented these
> kinds of things in MaxMSP; I’d like to go through the learning curve of
> making my own. I plan to use them for a variety of things, starting with
> granularization of sound files.
>
> Thanks in advance,
>
> Best,
>
> Steven
>
>
> —-
> Steven M. Miller
>
> Home < http://pubweb.csf.edu/~smill>SFIFEM < http://sfifem.csf.edu>
> Atrium Sound Space <
http://atrium.csf.edu>
> OVOS <
http://pubweb.csf.edu/~smill/ovos.html>
>
>
>
>

#99768
Mar 23, 2007 at 3:53pm

Thanks Owen, Nathan & Mark – much appreciated.

Nathan, I recalled looking at your window maker abstraction a while
back, and was very impressed at how clean & straight-forward it was.
I was avoiding looking at it right now, to force myself to figure it
out on my own. I may peak (peek~?) at it if I get stuck. Thanks!

Best,

Steven

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#99769
Mar 23, 2007 at 4:44pm

I’m looking at the window functions on Wikipedia…so far so
good…until I get to the formula for the Kaiser window. Can anyone
help a non-mathematician with implementing the ‘zeroth order modified
Bessel function of the first kind’ in this formula? I followed up to
the Wikipedia page for Bessel functions, and my eyes glazed over
pretty quickly…

I’m using [expr] for these window functions, if that helps.

Thanks!

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#99770
Mar 23, 2007 at 5:17pm

On Mar 23, 2007, at 11:53 AM, Steven Miller wrote:
> Nathan, I recalled looking at your window maker abstraction a while
> back, and was very impressed at how clean & straight-forward it
> was. I was avoiding looking at it right now, to force myself to
> figure it out on my own. I may peak (peek~?) at it if I get stuck.
> Thanks!

The hardest things for me to get my head around was the difference
between continuous and discrete-time functions. Most of the math web
sites will give you the continuous expression, but sampled waveforms
such as sound files are discrete.

Being a musician that got into programming then went back and took
some engineering courses, I never understood why my math/engineering
professors seemed obsessed with the continuous. Just tell me what I
need to feed the computer and keep your beautiful equations to
yourself. ;)

——————-
Nathan Wolek, PhD — nwolek@stetson.edu
Assistant Professor of Music Technology
Stetson University – DeLand, FL

http://www.nathanwolek.com

#99771
Mar 24, 2007 at 3:32am

#99772
Mar 24, 2007 at 4:24pm

Thank you, Jose – I’ll dig into this over the weekend!

On Mar 23, 2007, at 9:32 PM, jose manuel berenguer wrote:

> Hello
>

> perhaps that can be of some interest…
>
>
> jmb

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#99773
Mar 24, 2007 at 6:09pm
#99774
Mar 24, 2007 at 10:00pm

On Mar 24, 2007, at 2:09 PM, Steven Miller wrote:
> Any insights to share?

I just sat down an tried to do some math juggling to make them equal
and could not. I am sure I am doing something wrong. My books are
in my office and I am at home, so I am trying as best I can from
memory. I did this patch pre-Wikipedia. :)

Two points:
1) My first variable is the same as n/N in the Wikipedia formula.
This changes the math.
2) The version I use has implemented a “skew” functionality. You can
specify where the peak should be, with 0.5 being the mid-point. In
the Wikipedia version the peak is fixed at half way through the
window. This changes the math even more.

Hope that provides some insights as to why they are different. I
likely did some other programming reductions on the math to make it
compute faster. Even though it was not for real-time audio, I am
sure I could not fight the compulsion to make it more efficient.

> You also have a ‘quasi-gaussian’ window – what’s the difference there?

This one is easier. The quasi-gauss was an invention of Roads for
his early work on granular synthesis. Imagine splitting the Gaussian
window in half and using these halves as attack and decay portions of
your envelopes. Between them you just have a sustain or “straight
line”. Because the duration of the sustain is now longer, the net
effect is louder grains.

Remember that the Gaussian envelope in used in granular effects
primarily as an historical artifact. It is the envelope proposed by
Gabor in 1947 when he dreamed up granular synthesis. He had no way
to know what it would actually sound like. Whether it is the best
remains a matter of taste, more so in granular techniques than in
spectral techniques.

——————-
Nathan Wolek, PhD — nwolek@stetson.edu
Assistant Professor of Music Technology
Stetson University – DeLand, FL

http://www.nathanwolek.com

#99775
Mar 24, 2007 at 11:02pm

Thanks Nathan, much appreciated! And the quasi-gaussian explanation
vaguely jogs my memory from reading ‘Microsound’ a few years back.

On Mar 24, 2007, at 4:00 PM, Nathan Wolek wrote:

>
> Hope that provides some insights as to why they are different. I
> likely did some other programming reductions on the math to make it
> compute faster. Even though it was not for real-time audio, I am
> sure I could not fight the compulsion to make it more efficient.
>

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#99776
Mar 24, 2007 at 11:40pm

Here’s my implementation of the Wikipedia Gauss window function
< http://en.wikipedia.org/wiki/Window_function#Gauss_windows>. It no
longer produces ‘divide by zero’ errors, but it only creates the
first half of the function over the entire width of the window. Any
ideas what I’m doing wrong?

max v2;
#N vpatcher 717 201 1324 736;
#P window setfont “Sans Serif” 9.;
#P flonum 409 155 35 9 0. 0.5 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P message 336 111 43 196617 size $1;
#P newex 238 71 53 196617 t i i i i;
#P newex 280 91 66 196617 sampstoms~;
#P newex 238 49 91 196617 patcherargs 1024;
#P newex 106 49 67 196617 t b b;
#P newex 336 129 154 196617 buffer~ my-window 23.22;
#P newex 106 221 101 196617 peek~ my-window 1;
#P button 106 25 15 0;
#P newex 106 100 50 196617 uzi 1024;
#P newex 123 177 297 196617 expr exp(-.5*pow((($f1-($f2-1))/2)/(($f3*
($f2-1))/2)\,2));
#P newex 106 153 27 196617 t i i;
#N counter 0 0 1024;
#X flags 0 0;
#P newobj 106 129 89 196617 counter 0 0 1024;
#P connect 4 0 7 0;
#P connect 7 0 3 0;
#P connect 3 0 0 0;
#P connect 0 0 1 0;
#P connect 1 0 5 0;
#P connect 1 1 2 0;
#P fasten 10 0 3 1 243 95 151 95;
#P fasten 2 0 5 1 128 207 156 207;
#P connect 7 1 0 3;
#P fasten 10 1 0 4 257 108 187 108;
#P connect 8 0 10 0;
#P fasten 10 2 2 1 271 132 271 132;
#P connect 10 3 9 0;
#P connect 9 1 11 0;
#P connect 11 0 6 0;
#P fasten 12 0 2 2 414 174 414 174;
#P pop;

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>

#99777
Mar 25, 2007 at 9:03am

mind your brackets.
try this one.
v

max v2;
#N vpatcher 325 161 835 427;
#P window setfont “Sans Serif” 9.;
#P window linecount 1;
#P newex 65 103 289 196617 expr exp(-.5*pow(($f1-($f2-1)/2)/(($f3*
($f2-1))/2)\,2));
#P pop;

On 25 Mar 2007, at 00:40, Steven Miller wrote:

>
> Here’s my implementation of the Wikipedia Gauss window function
> < http://en.wikipedia.org/wiki/Window_function#Gauss_windows>. It no
> longer produces ‘divide by zero’ errors, but it only creates the
> first half of the function over the entire width of the window. Any
> ideas what I’m doing wrong?
>
> max v2;
> #N vpatcher 717 201 1324 736;
> #P window setfont “Sans Serif” 9.;
> #P flonum 409 155 35 9 0. 0.5 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
> #P message 336 111 43 196617 size $1;
> #P newex 238 71 53 196617 t i i i i;
> #P newex 280 91 66 196617 sampstoms~;
> #P newex 238 49 91 196617 patcherargs 1024;
> #P newex 106 49 67 196617 t b b;
> #P newex 336 129 154 196617 buffer~ my-window 23.22;
> #P newex 106 221 101 196617 peek~ my-window 1;
> #P button 106 25 15 0;
> #P newex 106 100 50 196617 uzi 1024;
> #P newex 123 177 297 196617 expr exp(-.5*pow((($f1-($f2-1))/2)/
> (($f3*($f2-1))/2)\,2));
> #P newex 106 153 27 196617 t i i;
> #N counter 0 0 1024;
> #X flags 0 0;
> #P newobj 106 129 89 196617 counter 0 0 1024;
> #P connect 4 0 7 0;
> #P connect 7 0 3 0;
> #P connect 3 0 0 0;
> #P connect 0 0 1 0;
> #P connect 1 0 5 0;
> #P connect 1 1 2 0;
> #P fasten 10 0 3 1 243 95 151 95;
> #P fasten 2 0 5 1 128 207 156 207;
> #P connect 7 1 0 3;
> #P fasten 10 1 0 4 257 108 187 108;
> #P connect 8 0 10 0;
> #P fasten 10 2 2 1 271 132 271 132;
> #P connect 10 3 9 0;
> #P connect 9 1 11 0;
> #P connect 11 0 6 0;
> #P fasten 12 0 2 2 414 174 414 174;
> #P pop;
>
> —-
> Steven M. Miller
>

#99778
Mar 25, 2007 at 11:47am

On Mar 24, 2007, at 7:40 PM, Steven Miller wrote:
> Any ideas what I’m doing wrong?

I can remember having this problem, however I cannot seem to recall
the solution. I played around with your [expr] formula but it did
not jog my memory. I believe this has something to do with why my
formula used n/N as a variable.

I’ll take a few minutes on monday to look over my sources when I am
back in the office. Maybe there is a problem with the wikipedia
article?

——————-
Nathan Wolek, PhD — nwolek@stetson.edu
Assistant Professor of Music Technology
Stetson University – DeLand, FL

http://www.nathanwolek.com

#99779
Mar 25, 2007 at 3:58pm

#99780
Apr 12, 2009 at 11:41pm

hello

i am currently generating some envelopes and was wondering how this is represented with the expression object?

http://upload.wikimedia.org/math/c/9/f/c9fb4d8d160cf7c76648c20f25045672.png

i’ve had a look at the other patches but i can’t quite figure which bits go where

#99781
Apr 13, 2009 at 12:37am

The problem I always have is getting the parentheses in the right place, I always end up forgetting a pair which completely changes the equation. Other times I use them everywhere and that makes reading the actual equation impossible! Here’s a patch that should show you how things are done.

lh

– Pasted Max Patch, click to expand. –
#99782
Apr 13, 2009 at 12:47am

Mike S wrote on Sun, 12 April 2009 18:41hello

i am currently generating some envelopes and was wondering how this is represented with the expression object?

I think this is it:

– Pasted Max Patch, click to expand. –
#99783
Apr 13, 2009 at 12:51am

You need an extra set of brackets around the $f2 – 1 bit other wise it will do the division first. The “n” is counting up in integers to a certain amount and the “N” is the total number of steps. Have a look at the patch I just posted to see what I mean.

lh

#99784
Apr 13, 2009 at 1:06am

smill wrote on Thu, 22 March 2007 18:42

I’d like to create some ‘roll-your-own’ abstractions for generating windows and storing them in buffers.

Off-topic a bit, but you might also try this patch, which gets snippets of any longer buffer~ into a multislider and then into another buffer~. So depending on what kind of audio you load into the main one, you could get some interesting waveforms which might be usable in windowing (or they may sound cool just by themselves). The multislider also lets you store presets and interpolate, to make new waveforms between saved ones.

– Pasted Max Patch, click to expand. –
#99785
Apr 13, 2009 at 1:47am

for musicians an oscillating and/or repetive and/or selfgenerating function is always continous, even if the same thing is a discrete time whatnot for the silly m4+h3m4+!k4nz_.

when i dealt with my very first fractal function i found out that any discrete time whathefuck can be “continous” wehen you just restart it from time to time. Smile

#99786
Apr 13, 2009 at 5:17pm

thanks for the replies, very helpful

out of interest i’ve been trying some of the other window functions on that page.

I’d quite like to know how to do these

Bartlett window (zero valued end-points)

- on this one i’m not sure what the vertical lines mean in the latter part of the equation

Gauss window, σ=0.4; B=1.45

- not sure what this part underneath is for?

Nuttall window, continuous first derivative

I’ve had a crack at this one, but i get a bit of a different window to the one described here http://en.wikipedia.org/wiki/Window_function

– Pasted Max Patch, click to expand. –
#99787
Apr 13, 2009 at 10:08pm

Bartlett: [expr (($i2-1)/2 - abs($i1-($i2-1)*0.5))/(($i2-1)*0.5)]

Gauss: [expr exp(-0.5*pow(($i1-(($i2-1)/2))/(0.4*(($i2-1)/2)),2))]

Nuttall: [expr 0.35875-(0.48829*cos((2*3.1415925635*$i1)/($i2-1)))+(0.14128*cos((4*3.1415925635*$i1)/($i2-1)))-(0.01168*cos((6*3.1415925635*$i1)/($i2-1)))]

Those should do the trick if you replace the [expr] in my previous patch with them. You could change the coefficients of the Nuttall equation to get the other curves on the wikipedia page. I always find it helpful to write the equation out on paper and then re-write it with breackets onto one line, it should then be in the form you need for use in [expr].

lh

#99788
Nov 19, 2009 at 6:48am

Hi,

This might be useful – it’s an abstraction for generating a bunch of typical window functions. Not perfect, and probably there are many important ones missing, but if you add more let me know and I’ll put it on maxobjects.com.

Here’s the help:

– Pasted Max Patch, click to expand. –

And here’s the abstraction (save as window.maxpat):

– Pasted Max Patch, click to expand. –

Best,

Graham

#99789
Nov 19, 2009 at 8:36am

>>”only going over half the buffer” ..

expr exp(-.5*pow((($f1-($f2-1))/2)/(($f3*
($f2-1))/2)\,2));

i had that experience also when building my first cosine and
hanning buffer maker. you use uzi and counter, and it counts
1024, and it does not peek 1024 but only 511, and you think “wtf??”

i found out that in my case it was the formula itself which was
wrong because it simply had a max() or a *(x>y) at the wrong place
so that the missing samples were actually samples of all 0. foat.

-110

oh, graham actually revived this thread from march — i knew
i´ve read something like that here before.
Smile

#99790
Nov 19, 2009 at 10:19am

Back in Supercollider 1.x days I used to use Apgrain which had some nice properties. I was so perplexed by the different window types and why Apgrain sounded so good to my hears that i asked James McCartney about it and he said in 1997 (yikes!) about it:

Apgrain gives a parabolic envelope. That is 1 – x*x evaluated
between -1 and +1. This happens to be a very simple envelope
to generate since it requires only a double integration (two adds).
It has a shape more like a Welch envelope than a Hanning one.
I actually prefer it because in the Hanning envelope the quiet
tails on the end are really inaudible when mixed with other grains
that mask it, so it is just wasted CPU to output it. A Welch envelope
matches the curve of an equal power panning function, so it has good
properties when overlapping fewer grains to get a smooth sound. This
isn’t exactly true of the parabola which is too ‘hot’ at the midpoint
of the curve, but it suits my purposes fine.

A hanning envelope shape is: .5 – .5 * cos(x); x = 0 to 2pi.

A welch envelope shape is: sin(x); x = 0 to pi

Well, i miss that hot parabolic envelope! I always liked how that sounded for grains.

(

quoted from here:
http://www.audiosynth.com/files/sc-users-archive/sc-users.9704

)

#99791

You must be logged in to reply to this topic.