DSPRelated.com
Forums

why does my FIR output contain discontinuities?

Started by amlangford December 17, 2011
>> and upsample it by 64, to create an output symbol duration of T =64ts >> I then filter it
my guess is, there is a discontinuity at the end of the impulse response, the input signal stream is [s1 0 0 0 0.... s2 0 0 0 0 ... s3 0 0 0 0 ...] and that's how it ends up in the output. Anyway, just a theory...
Hi all,

Thanks for the comments...apologies for the late feedback..

To re-iterate, the discontinuities Im seeing are in the output of my
filter.

I should add another "key" piece of information: The Matlab raised cosine
design methods all return an even ordered filter, and thus odd number of
taps. The filter structure Im loading the coefficients into is already
implemented in an FPGA, and expects an even number of taps. 

Thus, I have the problem - How do I extract an even number of taps for my
filter implementation from an odd number of designed coefficients.

I've tried dropping a coefficient from the start, middle and end of the
impulse response, but each results in the same discontinuities in the
output of my model of the hardware filter.

Also, while the impulse response approaches zero and the ends, it doesnt
quite get there!


On 12/19/2011 12:46 PM, amlangford wrote:
> Hi all, > > Thanks for the comments...apologies for the late feedback.. > > To re-iterate, the discontinuities Im seeing are in the output of my > filter. > > I should add another "key" piece of information: The Matlab raised cosine > design methods all return an even ordered filter, and thus odd number of > taps. The filter structure Im loading the coefficients into is already > implemented in an FPGA, and expects an even number of taps. > > Thus, I have the problem - How do I extract an even number of taps for my > filter implementation from an odd number of designed coefficients. > > I've tried dropping a coefficient from the start, middle and end of the > impulse response, but each results in the same discontinuities in the > output of my model of the hardware filter.
Design a filter with an even number of taps. If you don't have a canned routine to do that, roll your own. FIR filters are generally end-to-end symmetric. Removing any tap from a filter with an even number of them breaks that symmetry.
> Also, while the impulse response approaches zero and the ends, it doesnt > quite get there!
I generally design filters that way when I use windowing. By designing an N+2 tap filter that goes to zero at the ends, I can implement with only N taps, with a miniscule improvement in performance. Jerry -- Engineering is the art of making what you want from things you can get. �����������������������������������������������������������������������
Jerry, there's gotta be something that the OP is doing wrong, if he 
tests his filter with a sufficiently smooth input (we can get into 
quantizing that parameter later), it doesn't matter how his/her impulse 
response looks, he/she should get a smooth output.  if there are 
discontinuities, either he has to have discontinuities in *both* h[n] 
and x[n] (if a point in the spectrum of H[k] and X[k] is not zero, then 
*both* H[k] and X[k] are non-zero for that value of k.  for there to be 
discontinuities in y[k], then there is some high-frequency contect in 
Y[k] and then also in both X[k] and H[k] at those high frequencies.

so maybe there's an error in the code that is generating the 
discontinuities or maybe the OP has discontinuities in both input and 
impulse response.

-- 

r b-j                  rbj@audioimagination.com

"Imagination is more important than knowledge."



On 12/19/11 1:39 PM, Jerry Avins wrote:
> On 12/19/2011 12:46 PM, amlangford wrote: >> Hi all, >> >> Thanks for the comments...apologies for the late feedback.. >> >> To re-iterate, the discontinuities Im seeing are in the output of my >> filter. >> >> I should add another "key" piece of information: The Matlab raised cosine >> design methods all return an even ordered filter, and thus odd number of >> taps. The filter structure Im loading the coefficients into is already >> implemented in an FPGA, and expects an even number of taps. >> >> Thus, I have the problem - How do I extract an even number of taps for my >> filter implementation from an odd number of designed coefficients. >> >> I've tried dropping a coefficient from the start, middle and end of the >> impulse response, but each results in the same discontinuities in the >> output of my model of the hardware filter. > > Design a filter with an even number of taps. If you don't have a canned > routine to do that, roll your own. FIR filters are generally end-to-end > symmetric. Removing any tap from a filter with an even number of them > breaks that symmetry. > >> Also, while the impulse response approaches zero and the ends, it doesnt >> quite get there! > > I generally design filters that way when I use windowing. By designing > an N+2 tap filter that goes to zero at the ends, I can implement with > only N taps, with a miniscule improvement in performance. > > Jerry
On Mon, 19 Dec 2011 11:46:07 -0600, "amlangford"
<amlangford31@n_o_s_p_a_m.hotmail.com> wrote:

>Hi all, > >Thanks for the comments...apologies for the late feedback.. > >To re-iterate, the discontinuities Im seeing are in the output of my >filter. > >I should add another "key" piece of information: The Matlab raised cosine >design methods all return an even ordered filter, and thus odd number of >taps. The filter structure Im loading the coefficients into is already >implemented in an FPGA, and expects an even number of taps. > >Thus, I have the problem - How do I extract an even number of taps for my >filter implementation from an odd number of designed coefficients.
Just add a coefficient at one of the ends set zero so that there's an even number of taps. In other words, load your full odd-tapped coefficient set and set the remaining coefficient (at whichever end) to zero.
>I've tried dropping a coefficient from the start, middle and end of the >impulse response, but each results in the same discontinuities in the >output of my model of the hardware filter.
That's probably contributing to the problem. Dropping a coefficient from the middle will likely significantly change the frequency response of the filter.
>Also, while the impulse response approaches zero and the ends, it doesnt >quite get there!
That's normal. I agree with rb-j that if you're seeing discontinuities in the output with continuous inputs you probably have a significant error somewhere. Eric Jacobsen Anchor Hill Communications www.anchorhill.com
On 12/19/2011 1:58 PM, robert bristow-johnson wrote:
> > Jerry, there's gotta be something that the OP is doing wrong, if he > tests his filter with a sufficiently smooth input (we can get into > quantizing that parameter later), it doesn't matter how his/her impulse > response looks, he/she should get a smooth output. if there are > discontinuities, either he has to have discontinuities in *both* h[n] > and x[n] (if a point in the spectrum of H[k] and X[k] is not zero, then > *both* H[k] and X[k] are non-zero for that value of k. for there to be > discontinuities in y[k], then there is some high-frequency contect in > Y[k] and then also in both X[k] and H[k] at those high frequencies. > > so maybe there's an error in the code that is generating the > discontinuities or maybe the OP has discontinuities in both input and > impulse response.
Robert, You pointed that out a few posts back, and if it wasn't obvious before then, it has to be now. I was addressing another problem, maybe less important. After you remove any one tap from a palindrome-symmetric filter, it's not symmetrical any more. We know that the phase gets screwed up, and the frequency response will be off too. How much it will change depends on the original impulse response. If the original coefficients alternate sign, expect something drastic. Amlangford, If you must use Matlab's design, call for a filter that is one tap shorter than the structure to hold it and append a zero tap at the end. Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
Gentlemen ... thank you all for your suggestions. I have a few things to
try in Matlab now. Ill post back here with results.

Many thanks,
Adrian
On 12/19/2011 3:18 PM, Eric Jacobsen wrote:

   ...

> Just add a coefficient at one of the ends set zero so that there's an > even number of taps. In other words, load your full odd-tapped > coefficient set and set the remaining coefficient (at whichever end) > to zero.
The "far" end gives lower latency. Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
>On Mon, 19 Dec 2011 11:46:07 -0600, "amlangford" ><amlangford31@n_o_s_p_a_m.hotmail.com> wrote: > >>Hi all, >> >>Thanks for the comments...apologies for the late feedback.. >> >>To re-iterate, the discontinuities Im seeing are in the output of my >>filter. >> >>I should add another "key" piece of information: The Matlab raised
cosine
>>design methods all return an even ordered filter, and thus odd number of >>taps. The filter structure Im loading the coefficients into is already >>implemented in an FPGA, and expects an even number of taps. >> >>Thus, I have the problem - How do I extract an even number of taps for
my
>>filter implementation from an odd number of designed coefficients. > >Just add a coefficient at one of the ends set zero so that there's an >even number of taps. In other words, load your full odd-tapped >coefficient set and set the remaining coefficient (at whichever end) >to zero.
While true, adding a zero(or zeros) at one end gives equivalent output possibly with output delay difference, but any filter can be visualised as having zero(s) at one or other end. I think if your fpga structure has even number of coeffs then it is meant to have it for some good reason e.g. to obtain two equivalent polyphases if read one opposite the other. Adding a zero in this case will not help the purpose. You will then need to design your own even filter from cosine formula. Kadhiem
Here is example 80 taps root raised cosine. There are several equations
that give slight differences.

Moreover you may want even taps with two equal centre taps. That needs a
different approach(use firls setting Amp as required).

B= .15;   %rolloff
Fs = 1;
Rs = Fs/2;     
Ts = 1/Rs;

for i = -39:40
   h(i+40) = (sin(pi*i/Ts*(1-B)) +
4*B*i/Ts*cos(pi*i/Ts*(1+B)))/(pi*i/Ts*(1-(4*B*i/Ts)^2));
end

h(40) = 1;

kadhiem