[Stk] BlitSquare bug?
Steven Yi
stevenyi at gmail.com
Thu Mar 12 13:48:53 PDT 2015
Hi Gary,
I've gone through again my analysis again and I still see a problem.
Let me see if I can explain what I'm seeing better.
In BlitSquare.h, I see the integration really happening in this line:
lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
where the newly calculated value for lastBlitOutput_ and the leaky add
of 0.999 * lastFrame_[0] occur.
This line:
lastBlitOutput_ += temp;
adds temp, but the following line:
lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
stubtracts dcbState_. But the way the code is, by the time temp is
added and dcbState_ is subtracted, temp and dcbState_ are always equal
to each other. If we put the two above lines together, you get:
lastFrame_[0] = lasBlitOutput_ + temp - dcbState_ + 0.999 * lastFrame_[0];
but since temp == dcbState, the above is equivalent to:
lastFrame_[0] = lastBlitOutput_ + 0.999 * lastFrame_[0];
You can see it if you walk through the code and notice:
StkFloat temp = lastBlitOutput_;
dcbState_ = lastBlitOutput_;
The only time when those two values would not be equal to each other
is on the initial pass, if lastBlitOutput_ was initialized to a
different value than dcbState_. However, BlitSquare::reset() sets
both to 0.
Hopefully that's a little clearer. If not, I can write up some code
to show the issue that way.
Thanks,
steven
On Thu, Mar 12, 2015 at 1:56 PM, Gary Scavone <gary at ccrma.stanford.edu> wrote:
> Hi Steven,
>
> The bandlimited square wave is formed by integrating a bipolar blit. So, the line:
>
> lastBlitOutput_ += temp;
>
> accomplishes the integration. The subsequent filtering operation is a one-pole DC blocker and the line:
>
> dcbState_ = lastBlitOutput_;
>
> simply saves the current input state for the subsequent iteration. The DC blocker is required to avoid a DC offset that can accumulate over time from the integration.
>
> I don’t see a bug in the code.
>
> Regards,
>
> —gary
>
> On Mar 3, 2015, at 10:11 AM, Steven Yi <stevenyi at gmail.com> wrote:
>
>> Hi All,
>>
>> I was translating the STK code for BlitSquare to another language and
>> I have a question about the code. As far as I can tell, the code in
>> BlitSquare.h for the tick method looks to have a bug. I noticed this:
>>
>> StkFloat temp = lastBlitOutput_;
>> ...
>> lastBlitOutput_ += temp;
>>
>> // Now apply DC blocker.
>> lastFrame_[0] = lastBlitOutput_ - dcbState_ + 0.999 * lastFrame_[0];
>> dcbState_ = lastBlitOutput_;
>>
>> The value of dcbState_ and temp are both set to the lastBlitOutput_.
>> The calculation adds temp, but then subtracts dbcState_, which
>> effectively makes the line calculating last_frame_[0] :
>>
>> lastFrame_[0] = lastBlitOutput_ + 0.999 * lastFrame_[0];
>>
>> if one takes out the "lastBlitOutput_ += temp" line.
>>
>> In my translated code, I've plotted both the direct translation as
>> well as a version removing the use of temp and dcbState_ and I got the
>> same results.
>>
>> Could someone confirm my analysis about this code?
>>
>> Thanks!
>> steven
>>
>> _______________________________________________
>> Stk mailing list
>> Stk at ccrma.stanford.edu
>> http://ccrma-mail.stanford.edu/mailman/listinfo/stk
>
More information about the Stk
mailing list