Any easy way to fake anti-gaussian filter on samples?

Discussion of hardware and software development for Super NES and Super Famicom.

Moderator: Moderators

Forum rules
  • For making cartridges of your Super NES games, see Reproduction.
Post Reply
psycopathicteen
Posts: 3001
Joined: Wed May 19, 2010 6:12 pm

Any easy way to fake anti-gaussian filter on samples?

Post by psycopathicteen »

Either for hand-coded BRR samples, or doing some sort of software wave generating, is there a mathematically simplified way of doing this? Take for instance a square wave, if I made the wave like this {7,3,4,4,4,4,3,7,-7,-3,-4,-4,-4,-4,-3,-7} would that be close enough?
tepples
Posts: 22345
Joined: Sun Sep 19, 2004 11:12 pm
Location: NE Indiana, USA (NTSC)
Contact:

Re: Any easy way to fake anti-gaussian filter on samples?

Post by tepples »

That's the general idea of how to preemphasize a sample. To see whether you over- or underemphasized, you can render an SPC file to wave in an accurate SPC player and compare the output in the time domain with a ModPlug Tracker export of square wave samples with the same length and cubic resampling.

Why cubic? It has the same support width as Gaussian resampling: four sample periods. But unlike Gaussian resampling, cubic resampling uses negative weights for two of the samples, which allows it to preserve more of the high frequencies without having to bake pre-emphasis into every encoded wave.

In my tests, the square wave I've been using is this:

Code: Select all

  .byte $B0,$9B,$BB,$BB,$BB,$BB,$BB,$BB,$B9
  .byte $B3,$75,$55,$55,$55,$55,$55,$55,$57
That corresponds to these sample values:

Code: Select all

[
    -7, -5, -5, -5, -5, -5, -5, -5,
    -5, -5, -5, -5, -5, -5, -5, -7,
    7, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 7
]
I haven't had a chance to do rigorous tests on this to see whether I over- or under-preemphasized though.

The ideal preemphasis to compensate for Gaussian resampling is deconvolution with the Gaussian kernel. If you're building your own BRR encoder, try approximating it by convolving the sample with [-1, 6, -1]/4 or [-1, 10, -1]/8. The first of these means you take the current sample times -1, the previous sample times 6, and the sample before that times -1, add them, and divide the sum by 4.
psycopathicteen
Posts: 3001
Joined: Wed May 19, 2010 6:12 pm

Re: Any easy way to fake anti-gaussian filter on samples?

Post by psycopathicteen »

I looked at the actual spc700 gaussian table and it looks like it is roughly a (.18, .64, .18) convolution. Convoluting it with a (-.5, 2, -.5) would make it (-.09, .04, 1.1, .04, -.09) convolution, which I think is close enough for it.
Post Reply