Milnot Cheesecake, Choose-Your-Own Adventure Style

Written 2025-11-24

Tags:Cheesecake Milnot 

This makes a sweet, fluffy, whipped cheesecake desert. I'll start with the family recipe, then go into specifics that can be tuned.

What is Milnot?

Well it's not milk, that much is for certain. Through the magic of science and technology, Milnot is canned, evaporated milk that has had its milkfat replaced with vegetable fat. Originally a cost effective, shelf-stable milk, it can sometimes be found in midwest grocery stores. I've never seen it used for anything other than this recipe. It has a peculiar property, in that it whips exceptionally well. Though you can also use evaporated milk, which is more common.

A bit of history

Originally Milnut, Milnot dates back to the great depression. Due to interstate commerce milk purity laws, the original cans stated something like "not to be confused with evaporated milk". The Milnot factory stradles the Missouri-Oklahoma border.

A Base Recipe for Milnot Cheesecake

Ingredients

Steps

  1. Place the Milnot in the freezer - want this to be as cold as possible. Also, don't take a break and forget it's in there!
  2. Dissolve the Jello in 1 cup of boiling water. Once dissolved, place in the freezer on a hot pad until slightly thickened - this should take about 20 minutes.
  3. Cream the cheese, vanilla, and sugar together. I do this in a Kitchenaid mixer - if you have the paddle blade with rubber scrapers, use that. Otherwise take a few breaks to knock down the mix that works its way up the sides of the bowl. We want to ensure all sugar has dispersed into the cream cheese.
  4. Mix in the Jello just a bit at a time and set aside. I turn on the mixer, add a splash of Jello, and wait for it to disperse. These two materials, cheese and Jello-water, won't want to mix naturally. Using cold cream cheese or adding Jello too quickly is more likely to form pearls of cream cheese that don't mix smoothly.
  5. Whip Milnot until fluffy. Use the whisk attachment on the mixer. This works best the colder everything is. Placing the mixer bowl in the freezer for a few minutes can help too.
  6. Fold whipped Milnot into jello-cheese
  7. Pour into graham cracker crust
  8. Refrigerate overnight

Fluffy or Richer?

My wife tends to prefer a richer Milnot cheesecake - no worries, double the cream cheese and read on!

Cream cheese to Sugar Ratio

The above family recipe calls for 1 cup of sugar per block of cream cheese. This is on the higher end of what I have seen used, but hey, it's a dessert! I've seen other receipes go as low as 1/3 cup of sugar per 8oz cream cheese, and from experience that's too low, and you get too much cream cheese tartness. 1/2 cup or 2/3 cup of sugar per block is also good.

I'm not considering the sugar and tartness of the Jello since those are somewhat balanced already in the Jello.

Other Flavors

We can swap out the Jello for other flavors, and sometimes the lemon juice too. Lime Jello and lime-juice makes for a nice lime cheesecake. Cherry jello and lemon juice is good too. I'd lean more on the stronger fruit flavors. Certainly no celery.

Alpha Filter Initialization

Written 2025-11-17

Tags:filters 

My home has mostly been converted to LED lightbulbs. With a variety of needs of brightness and socket bases, we have a variety of bulbs on switched dimmers, with a variety of turn-on behaviours. Some start from zero and ramp up. Some start from the minimum turn-on level of the bulb. Some seemingly start randomly then approach the expected output level. This has got me thinking about the topic of filter-initialization.

AC Dimmer Introduction

Wall power here is 120-Volt, AC/sine, 60Hz. Typical home dimmer systems operate by chopping the sine-wave at a specified phase(point in time relative to the cycle). This leads to a rather jumpy voltage delivery to light bulbs. In the incandescent past, the thermal mass of bulb filaments was enough to filter out the voltage spikes from the dimmer. With the advent of LED bulbs, "dimmable" bulbs usually include a decoder or filter of sorts to handle this.

Alpha-Filter Introduction

An alpha filter, or exponential moving average filter, is one of the simplest low-pass IIR filters. Generally, the filter is represented by two values. The first value is a state-variable that is updated each time we process a new sample. The first value is a constant, named alpha, that relates to how much smoothing occurs. For each sample the math is simply:
state = sample * alpha + prevState * (1 - alpha)

When alpha=1.0, the filter simply passes input to output, and can be considered to have unlimited bandwidth. When alpha=0.0, the filter blocks any changes as has zero bandwidth. Everything in-between provides a trade-off between responsiveness and smoothness. Typically, alpha is an application-specific constant.

I have no idea if light-bulbs use alpha-filters, but we'll use them as a way to discuss a more general problem.

Initialization

What should we use for prevState for the first sample? In some applications turn-on transients may not matter too much, but here are a few approaches:

Option1: zero

prevState = 0

Starting at zero means the filter is going to under-estimate the target value for a while, but in the case of a light-bulb this can give a slow but not unpleasant ramp-up, especially while carrying a newborn infant around the house wondering about how my lightbulbs handle filter initialization. One downside is that there is a noticeable delay getting a useful level of light output.

Option2: minimum bulb output

prevState = minOutput

Similar to starting at zero, starting from the minimum bulb steady-state output also gives us a small amount of light immediately, then ramp-up to the target. One odd thing about this when the dimmer is set to the minimum level when switched on, the bulb turns on immediately but then doesn't ramp up at all since it's already reached its target output. It feels inconsistent and find myself sometimes expecting it to brighten further.

Option3: first sample

prevState = anyPossibleInputValue

Some of my lightbulbs strike on to a seemingly random value, then ramp up or down as needed to the target dimming. Due to the chopped AC waveform, this is almost certainly the wrong choice for a light bulb, but may not be a bad choice for other applications.

But this approach has one advantage - on average, it'll at least start somewhere in the expected range.

This is equivalent to overriding alpha=1.0, just for the first sample.

Proposal: variable filter bandwidth initialization

What if we ramped alpha from 1.0 toward during the first few samples? It turns out we can get both quick initialization and a variety of filter responses from this. One possibility - substitute alpha for 1/N (where N is the sample-number, starting with 1):

state = sample * 1/N + prevState * (1 - 1/N)

This happens to generate a sliding-window filter. After 1/N decreases below some minimum-alpha, we can transition to traditional alpha-filter behaviour, like so:

tmpAlpha = MAX(alpha, 1/N)
state = sample * tmpAlpha + prevState * (1 - tmpAlpha)

The end result of this is that we take the first sample as truth, then several subsequent samples are averaged together with decreasing filter bandwidth for each, before reaching our final minimum bandwidth steady-state alpha. Early during startup this can lead to very noisy samples, so we might want to clip tmpAlpha, like so:

tmpAlpha = CLAMP(alpha, 1/N, 10 * alpha)
state = sample * tmpAlpha + prevState * (1 - tmpAlpha)

Here's what that looks like. 1500 random samples, alpha=0.002 for the fixed-bandwidth filters, but ranges 0.002 to 0.02 for the variable filter:

alphaFilterInitialization

The variable-bandwidth filter approaches the target value quickly, perhaps a little too quickly and overshoots slightly, then smoothly approaches much quicker than constant alpha filters.

Toyota ETCS-i is Expo!

Written 2025-09-08

Tags:ETCS-I Toyota 

One of the upsides to older car ownership is that over time, more internal information tends to leak out from manufacturers.

Every vehicle has a relationship between pedal input and throttle. With older vehicles, there was a lever, linkages, or cables between the pedal and engine. Some amount of nonlinearity can be chosen by adjusting the linkages or the throttle pulley. With electronic systems, we can replace that relationship with software, and switch it at runtime.

Toyota's implementation is known as Electronic Throttle Control System- intelligence(or ECTS-i), and I recently found a "How it works" PDF. Largely the 2000s can be divided into three periods for each Toyota model: before ETCS-i(mechanical throttle cable and pulley), ETCS-i with mechanical fallback, all-electric ETCS-i.

At time of writing, I still own a 2002 Toyota Highlander. There's a throttle cable between the pedal and throttle, so I knew it wasn't not fully electric. This car features a Snow-Mode button that tends to reduce take-off burnouts, but I have always wondered exactly how it works. This PDF confirms that snow mode does nothing at all to the throttle - Highlanders up to 2003 are mechanical cable only, and 2004 and beyond are ETCS-i. This largely confirms that snow-mode on these earlier 1st gen cars is implemented by adjusting the transmission shift points.

Later on in the document, there's an interesting description of the details of the newer implementations. To start, the pedal is a 5v sensor, and outputs a linearized DC voltage(presumably with the standard headroom & footroom that allows the ECU to detect a broken or shorted signal wire). Once the ECU reads the input from the pedal, it can remap the pedal to throttle relationship programmatically, like so:

Toyota_ETCS_I Control_modes

Anyone who has tuned RC vehicles may recognize these curves as...mostly just expo!

Older