The Transmogrifier does all this, "better". First, it does not round the measured timings, but builds up a histogram, and then replaces all timings in one "bin" by the average of the entries in a particular bin. (I can probably prove (in the mathematical sense) that this in general gives better results.) We arrive at a small number of timings and on-off pairs. Let's do an example. Note that using the option --statistic makes the program print such stuff. We use Vicky's f8-f12.ict for the example:
Hmmm, looks uncool: the A and B gaps are just too close to one another to make sense. We try to increase the absolute tolerance parameter to 150, to get wider bins, and lump the A and B together. (The default value is 100 (microseconds)).
Looks much better! We now have only one gap of around 300 micros. Also note that the program has found a "least common denominator" for (most) of the durations (here 301). The sequences are now represented as a sequence of "Pairs", see "F8 down" above. First problem solved.
Next, we try to find a "model to fit to the data", namely to find a type of "meta protocol" that could have generated the actual data. These are called "decoders"; there are presently nine such (TrivialDecoder, Pwm2Decoder, Pwm4Decoder, Pwm4AltDecoder,
XmpDecoder, BiphaseDecoder, BiphaseWithStartbitDecoder, BiphaseWithDoubleToggleDecoder, SerialDecoder). (The almost identical decoders BipaseDecoder and BiphaseWithStartBitDecoder amonts to your "split double times into 2 and put a marker between the pairs") (This list is printed by --decoder list.) Every signal is tried with all decoder, if succeeding, presenting a a "protocol" in IRP format (with all parameters assigned). With the option --all, these are all printed. Again, with Vicky's data:
Code: Select all
irptransmogrifier --absolutetolerance 150 analyze --all --namedinput f8-f12.ict
F8 Down: {36.3k,301,msb}<>(9,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,2,-1,1,-2,1,-1,2,-2,1,-1,1,-1,1,
-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-74m,
9,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,2,-1,1,-2,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,1,
-1,1,-1,1,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-74m){}
weight = 132 TrivialDecoder
{36.3k,301,msb}<1,-1|2,-2>(9,-1,A:6,2,-1,1,-2,B:24,-74m,9,-1,C:6,2,-1,1,-2,D:24,-74m){A=0x10,B=0x402100,C=0x10,D=0x402100}
weight = 32 Pwm2Decoder
{36.3k,301,msb}<1,-1|1,-2|2,-1|2,-2>(9,-1,A:62,1,-74m,9,-1,B:62,1,-74m){A=0xc024c000300c000,B=0xc024c000300c000}
weight = 34 Pwm4AltDecoder
{36.3k,301,msb}<1,-1|1,-2|1,-3|1,-4|1,-5|1,-6|1,-7|1,-8|1,-9|1,-10|1,-11|1,-12|1,-13|1,-14|1,-15|1,-16>
(9,-1,A:4,2,-2,B:16,2,-1,C:8,2,-2,D:32,2,-2,E:16,2,-2,F:28,1,-74m,9,-1,G:4,2,-2,H:16,2,-1,I:8,2,-2,J:32,
2,-2,K:16,2,-2,L:28,1,-74m){A=0x0,B=0x0,C=0x10,D=0x0,E=0x0,F=0x0,G=0x0,H=0x0,I=0x10,J=0x0,K=0x0,L=0x0}
weight = 108 XmpDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,A:37,-74m,9,B:37,-74m){A=0x419004100,B=0x419004100}
weight = 20 BiphaseDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,-1,A:1,2,-2,B:4,2,C:1,-2,D:1,2,-2,E:8,2,-2,F:4,2,-2,G:8,-74m,9,H:37,-74m){A=0x1,B=0xf,C=0x0,D=0x1,E=0xff,F=0xf,G=0xff,H=0x419004100}
weight = 41 BiphaseWithStartbitDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,A:37,-74m,9,B:37,-74m){A=0x419004100,B=0x419004100}
weight = 20 BiphaseWithDoubleToggleDecoder
{36.3k,301,msb}<-1|1>(A:63,B:20,-74m,C:63,D:20,-74m){A=0x7fd6556965555655,B=0x65555,C=0x7fd6556965555655,D=0x65555}
weight = 90 SerialDecoder
f9 Down: {36.3k,301,msb}<>(9,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,2,-1,1,-2,2,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,
-1,1,-1,1,-1,1,-1,2,-2,1,-1,1,-1,1,-1,2,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-74m){}
weight = 66 TrivialDecoder
{36.3k,301,msb}<1,-1|2,-2>(9,-1,A:6,2,-1,1,-2,B:24,-74m){A=0x10,B=0x802200}
weight = 18 Pwm2Decoder
{36.3k,301,msb}<1,-1|1,-2|2,-1|2,-2>(9,-1,A:62,1,-74m){A=0xc02700003030000}
weight = 21 Pwm4AltDecoder
{36.3k,301,msb}<1,-1|1,-2|1,-3|1,-4|1,-5|1,-6|1,-7|1,-8|1,-9|1,-10|1,-11|1,-12|1,-13|1,-14|1,-15|1,-16>
(9,-1,A:4,2,-2,B:16,2,-1,C:4,2,-2,D:36,2,-2,E:12,2,-2,F:32,1,-74m){A=0x0,B=0x0,C=0x1,D=0x0,E=0x0,F=0x0}
weight = 69 XmpDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,A:37,-74m){A=0x41a004200}
weight = 12 BiphaseDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,-1,A:1,2,-2,B:4,2,C:1,-2,2,-2,D:9,2,-2,E:3,2,-2,F:9,-74m){A=0x1,B=0xf,C=0x0,D=0x1ff,E=0x7,F=0x1ff}
weight = 31 BiphaseWithStartbitDecoder
{36.3k,301,msb}<-1,1|1,-1>(9,A:37,-74m){A=0x41a004200}
weight = 12 BiphaseWithDoubleToggleDecoder
{36.3k,301,msb}<-1|1>(A:63,B:20,-74m){A=0x7fd6556995555655,B=0x95555}
weight = 48 SerialDecoder
(output only from the first signal.) Which one of these is correct? Strictly speaking, they all are, since they could explain the measured data! To solve this problem (better, heuristically select the "nicest" solution), for every protocol, a "weight" is computed, and the protocol with the lowest weight is presented:
(Compare with the above output, only the protocol with the lowest weight is now output.)
Next note that some of Vicky's are pretty long, because it contained repeats. For this, the repeatfinder can/should be invoked, using the option --repeatfinder, these are identified and taken care of.
As a final word: Presently the program is command line only. This is not because I find it better than a GUI or such, but mainly because the GUI is not yet written. Likely the program (a large part of it) will be integrated into IrScrutinizer. (But, a good command line program is IMHO better than a bad GUI program
).