Halfband filter True or false?

Started by March 8, 2005
```  % Here is another method that gives the exact zeros.  Scaled as
decimation filter (DC Gain=1.0). Middle tap of 0.5. Equiripple error.

M=2     ;   % 1, 2, 3, 4, ... for length N=4*M+3... M!=0 for this
script

fp=0.1  ;   % fraction of input sample rate

F=[0 fp];
A=[0.5 0.5];
h0=firpm(2*(M+1)-1,F*4,A);  % aka remez()
h1=zeros(2,2*(M+1));
h1(1,:)=h0;
h=reshape(h1,1,4*(M+1));
h(4*(M+1))=[];
h(2*M+2)=0.5
N=length(h);

Enjoy,

Dirk

```
```Symon wrote:
> The inverse DFT of a brick wall filter is a sinc function. Unfortunately
> this exists for all time so it's tricky to make a filter from it. You can
> window the sinc function to limit it to a certain time period, depending on
> how many taps you want. This gives you an approximation to a brick wall
> filter. I wouldn't use this method, I like that Parks McCellan thingy.
> Cheers, Syms.

Syms,

Have you tried to design a half-band filter using a Parks-McClellan
program not specialized for it? The supposedly zero terms usually have
small values, often large enough to disturb the filter's response if
they are zeroed. Windowed-sync design is a quick fix that rarely needs
more than an additional pair of taps to equal a constrained P-M design.

...

Jerry
--
Engineering is the art of making what you want from things you can get.
&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;
```
```"Jerry Avins" <jya@ieee.org> wrote in message
news:d_qdnYL5Jv1X27LfRVn-3g@rcn.net...
> Syms,
>
> Have you tried to design a half-band filter using a Parks-McClellan
> program not specialized for it? The supposedly zero terms usually have
> small values, often large enough to disturb the filter's response if they
> are zeroed. Windowed-sync design is a quick fix that rarely needs more
> than an additional pair of taps to equal a constrained P-M design.
>
Hi Jerry,
A while ago, I transcribed the Fortran program in Rabiner & Gold's book into
Perl. (OK, I know that's mad, but at least I recognise it's mad!) I
increased the accuracy of the variables and haven't looked back since, no
problems with zero coeffs in half-band filters, they work great. (The Perl
program is useful for tampering with the weighting function, IIRC I couldn't
do that with MatLab)
I should add that a lot of my DSP work is in FPGAs with high sample rates
but with fixed point, typically 16 bit accuracy and maybe 19 or 20 tap
filters. (39 taps with half band filters!) So, my accuracy isn't the
greatest, any small inaccuracies from Parks-McClellan are not too important
for my app.
Having said all that, and now you've made me think about it properly, I must
agree with you; the sinc method guarantees a half-band design with the zero
coeffs exactly zero. Next time I need long filters and more accurate taps
Thanks.
Cheers, Syms.

p.s. Half band FIR filters always have an odd number of taps, correct?

p.p.s. OT, but that Perl/Fortran madness thing reminded me of Salvador Dali,
"The only difference between me & a madman is that I am not mad."

```
```Symon wrote:

...

> Hi Jerry,
> A while ago, I transcribed the Fortran program in Rabiner & Gold's book into
> Perl. (OK, I know that's mad, but at least I recognise it's mad!) I
> increased the accuracy of the variables and haven't looked back since, no
> problems with zero coeffs in half-band filters, they work great. (The Perl
> program is useful for tampering with the weighting function, IIRC I couldn't
> do that with MatLab)
> I should add that a lot of my DSP work is in FPGAs with high sample rates
> but with fixed point, typically 16 bit accuracy and maybe 19 or 20 tap
> filters. (39 taps with half band filters!) So, my accuracy isn't the
> greatest, any small inaccuracies from Parks-McClellan are not too important
> for my app.
> Having said all that, and now you've made me think about it properly, I must
> agree with you; the sinc method guarantees a half-band design with the zero
> coeffs exactly zero. Next time I need long filters and more accurate taps
> Thanks.
> Cheers, Syms.
>
> p.s. Half band FIR filters always have an odd number of taps, correct?

Yes.

> p.p.s. OT, but that Perl/Fortran madness thing reminded me of Salvador Dali,
> "The only difference between me & a madman is that I am not mad."

That would make a good sig for you. I can't use it because I can't vouch
for the last four words.

You might modify your Perl code to force the zero taps while optimizing
the rest. Windowed sinc is just a work-around for those who don't have that.

Jerry
--
Engineering is the art of making what you want from things you can get.
&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;
```
```"Symon" <symon_brewer@hotmail.com> wrote in message
news:3990olF5v573eU1@individual.net...
> "Jerry Avins" <jya@ieee.org> wrote in message
> news:d_qdnYL5Jv1X27LfRVn-3g@rcn.net...
>> Syms,
>>
>> Have you tried to design a half-band filter using a Parks-McClellan
>> program not specialized for it? The supposedly zero terms usually have
>> small values, often large enough to disturb the filter's response if they
>> are zeroed. Windowed-sync design is a quick fix that rarely needs more
>> than an additional pair of taps to equal a constrained P-M design.
>>
> Hi Jerry,
> A while ago, I transcribed the Fortran program in Rabiner & Gold's book
> into Perl. (OK, I know that's mad, but at least I recognise it's mad!) I
> increased the accuracy of the variables and haven't looked back since, no
> problems with zero coeffs in half-band filters, they work great. (The Perl
> program is useful for tampering with the weighting function, IIRC I
> couldn't do that with MatLab)
> I should add that a lot of my DSP work is in FPGAs with high sample rates
> but with fixed point, typically 16 bit accuracy and maybe 19 or 20 tap
> filters. (39 taps with half band filters!) So, my accuracy isn't the
> greatest, any small inaccuracies from Parks-McClellan are not too
> important for my app.
> Having said all that, and now you've made me think about it properly, I
> must agree with you; the sinc method guarantees a half-band design with
> the zero coeffs exactly zero. Next time I need long filters and more
> accurate taps (which can cause P-M algorithms problems) I'll think about
> Cheers, Syms.
>
> p.s. Half band FIR filters always have an odd number of taps, correct?
>
> p.p.s. OT, but that Perl/Fortran madness thing reminded me of Salvador
> Dali, "The only difference between me & a madman is that I am not mad."

In case you get lazy, you can get my program.  It's much like the P-M and
does halfband filters exactly out to around length 250 or so as I recall:

ftp://ftp.mission-systems-inc.com/outgoing/Halfband/

Fred

```
```in article d_qdnYL5Jv1X27LfRVn-3g@rcn.net, Jerry Avins at jya@ieee.org wrote
on 03/09/2005 13:56:

> Have you tried to design a half-band filter using a Parks-McClellan
> program not specialized for it? The supposedly zero terms usually have
> small values, often large enough to disturb the filter's response if
> they are zeroed. Windowed-sync design is a quick fix that rarely needs
> more than an additional pair of taps to equal a constrained P-M design.

i haven't fiddled that much with half-band P-M (using the MATLAB remez())
function, but i do have an implementation of it (you have to make sure that
the filter spec and weighting factors are precisely symmetrical about half
Nyquist).  my experience with it the coefficients that aren't zero are so
damn close that when i do force them to zero, it apparently changes nothing.

if you have MATLAB, Jerry, i could send this to you.

--

r b-j                  rbj@audioimagination.com

"Imagination is more important than knowledge."

```
```in article 3990olF5v573eU1@individual.net, Symon at symon_brewer@hotmail.com
wrote on 03/09/2005 14:23:

> The Perl
> program is useful for tampering with the weighting function, IIRC I couldn't
> do that with MatLab)

dunno when that was, but the MATLAB remez() function (or firls()) that i
have seen for a decade has a weighting vector as an argument.

--

r b-j                  rbj@audioimagination.com

"Imagination is more important than knowledge."

```
```robert bristow-johnson wrote:
> in article d_qdnYL5Jv1X27LfRVn-3g@rcn.net, Jerry Avins at jya@ieee.org wrote
> on 03/09/2005 13:56:
>
>
>>Have you tried to design a half-band filter using a Parks-McClellan
>>program not specialized for it? The supposedly zero terms usually have
>>small values, often large enough to disturb the filter's response if
>>they are zeroed. Windowed-sync design is a quick fix that rarely needs
>>more than an additional pair of taps to equal a constrained P-M design.
>
>
> i haven't fiddled that much with half-band P-M (using the MATLAB remez())
> function, but i do have an implementation of it (you have to make sure that
> the filter spec and weighting factors are precisely symmetrical about half
> Nyquist).  my experience with it the coefficients that aren't zero are so
> damn close that when i do force them to zero, it apparently changes nothing.
>
> if you have MATLAB, Jerry, i could send this to you.

I don't have Matlab and I haven't tried it in Scilab. The program I did
use wasn't ad good as you describe.

Jerry
--
Engineering is the art of making what you want from things you can get.
&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;&#2013266095;
```
```> SBA = 80;  (stop band attenuation in dB)
> t = linspace(-(N-1)/4, (N-1)/4, N);
> h = (0.5*sinc(t)) .* kaiser(N, 0.1102*(SBA-8.7))'; % kaiser windowed
sinc()
> clear t;

it's nice to have an exact form for Halfband filter rather than using
a quite complex optimisation method.
BTW i should have remembered the principles, they are in my school book
=> Proakis chapter  8.2.2 Design of Linear-phase FIR filter using
Windows :-)

thanks,

Julien

```
```Hi Robert,
So in Matlab there's a function gremez.
From the help:-
b = gremez(n,f,a,w) returns a length n+1 linear phase FIR filter which has
the best approximation to the desired frequency response described by f and
a in the minimax sense. w is a vector of weights, one per band. When you
omit w, all bands are weighted equally.

One weight per band was no good to me, I wanted to change the weights
gradually over the whole frequency grid. You _can_ get gremez to call a
function to generate an arbitrary frequency response, but not for the
weighting function.
So, maybe I'm not quite so mad after all? (Yeah, right!)
Cheers, Syms.

"robert bristow-johnson" <rbj@audioimagination.com> wrote in message
news:BE551367.51C8%rbj@audioimagination.com...
> in article 3990olF5v573eU1@individual.net, Symon at
> symon_brewer@hotmail.com
> wrote on 03/09/2005 14:23:
>
>> The Perl
>> program is useful for tampering with the weighting function, IIRC I
>> couldn't
>> do that with MatLab)
>
> dunno when that was, but the MATLAB remez() function (or firls()) that i
> have seen for a decade has a weighting vector as an argument.
>

```