Sorry for the wait. Due to some inconsistencies in measurements, it took longer than we thought it would to get this. We had to redo several of the measurements, of which the corrected values in this list are bolded (with the old value in parenthesis). After this, I'm 99% sure that I was right in my initial suspicion that c = 165. We're in the middle of testing other values right now to make sure this holds true for them, too. For now, here's our data:
(percent - calculated hitstun to one decimal place - actual hitstun)
19 - 3695 - 22.4 - 23
25 - 3904 - 23.7 - 24 (was 25)
35 - 4263 - 25.8 - 26
40 - 4418 - 26.7 - 27
45 - 4615 - 27.97 - 28 (was 29)
51 - 4812 - 29.1 - 30
55 - 4975 - 30.2 - 31 (was 30)
60 - 5139 - 31.1 - 32
65 - 5326 - 32.3 - 33
70 - 5501 - 33.3 - 34 (was 35)
91 - 6236 - 37.8 - 38
109 - 6892 - 41.8 - 42
Assuming the hitstun data is all correct, then each value in this list checks out.
Kupo also did a quick test of bowser's fsmash against tl, and got
(percent - calculated hitstun to one decimal place - actual hitstun)
76 - 5046 - 30.6 - 31
Which also checks out. Although the model that the strict data points produce actually comes out to something like
l = 165h - 125
or
h = (l + 125)/165
None of the numbers we got check out for it, so I think I can say with confidence that the formula for hitstun is
h = l/165
Where h = hitstun and l = launch speed, and the result is rounded up to the nearest whole frame.
Hopefully some other people can test this, too, and verify our results. Kupo should be back shortly to post the method he used to get the hitstun data.