freqz produces incorrect output
Ben Abbott
bpabbott at mac.com
Sun Jan 25 14:38:40 CST 2009
On Jan 25, 2009, at 12:46 PM, Søren Hauberg wrote:
> søn, 25 01 2009 kl. 12:07 -0500, skrev Ben Abbott:
>> Søren, can you try these instead?
>>
>> freqz ([ones(1, 20), zeros(1, 768-20)], 1, 512, "half", 2);
>>
>> freqz ([zeros(1, 768-20), ones(1, 20)], 1, 512, "half", 2);
>
> I've updated http://hauberg.org/freqz to only show these results
>
> Søren
Thanks Søren!
The second phase curve is different from Octave's. Specifically, the
phase slope of the prepad (2nd) example has the opposite sign.
Using octave, I notice the sign of the phase slope is dependent upon
the degree by which the input sequence exceeds the length of the
frequency vector. For the present example, the sign of the phase slope
changes sign when the length input vector is greater than 522. See the
examples below ...
freqz ([zeros(1, 522-20), ones(1, 20)], 1, 512, 'half', 2);
freqz ([zeros(1, 523-20), ones(1, 20)], 1, 512, 'half', 2);
So this problem manifests when the nominal delay exceeds 512.
My understanding is that the two responses below should be the same.
p = [zeros(1, 768-20), ones(1, 20)];
hz = freqz (p, 1, 512, 'half', 2);
hf = fft (p, 1024)(1:512);
... and Octave does produce identical results.
Assuming that there is no problem with either Matlab or my
understanding, I'm inclined to question the manner by which the two
implementations are unwrapping the phase.
If the phase is unwrapped such that only positive delays are possible,
I octave will produce the same plot as does Matlab. For example, the
result below, looks convincing.
f = (0:511)/512;
da = -pi*f*512;
plot (f, (unwrap(angle(hz)-da)+da)*180/pi, ...
f, (unwrap(angle(hf)-da)+da)*180/pi)
If my inference is correct, then freqz.m is not to blame. The problem
is superficial, and is in freqz_plot.m
I'm not familiar with the signal processing functions. If someone has
an opinion how/where this should be resolved, I'd appreciate the input.
For the time being, I'll assume it is best to modify freqz_plot.m, and
generate a changeset including each of these changes.
Ben
More information about the Bug-octave
mailing list