Modified Frequency Modulation, commonly MFM, is a run-length limited (RLL) coding scheme used to encode the actual data-bits on most floppy disks. It was first introduced in disk drives with the IBM 3330 hard disk drive in 1970. Floppy disk drive hardware examples include Amiga, most CP/M machines as well as IBM PC compatibles. MFM is a modification to the original digital FM (digital frequency modulation also known as delay coding) scheme for encoding data on single-density floppy disks and some early hard disk drives. Due to the minimum spacing between flux transitions that is a property of the disk, head and channel design, MFM, which guarantees at most one flux transition per data bit, can be written at higher density than FM, which can require two transitions per data bit. It is used with a data rate of 250–500 kbit/s (500–1000 kbit/s encoded) on industry standard 5¼-inch and 3½-inch ordinary and high density diskettes. MFM was also used in early hard disk designs, before the advent of more efficient types of run-length limited codes. Except for the steadily disappearing 360 KiB/1.2 MiB (5.25-inch) and 720~880 KiB/1.4~1.6 MiB (3.5-inch) floppy disk formats, MFM encoding is obsolete in magnetic recording.
Delay encoding is the encoding of binary data to form a two-level signal where (a) a "0" causes no change of signal level unless it is followed by another "0" in which case a transition to the other level takes place at the end of the first bit period; and (b) a "1" causes a transition from one level to the other in the middle of the bit period.
Delay encoding is used primarily for encoding radio signals because the frequency spectrum of the encoded signal contains less low-frequency energy than a conventional non-return-to-zero (NRZ) signal and less high-frequency energy than a biphase signal.
Delay encoding is an encoding using only half the bandwidth for biphase encoding but features all the advantages of biphase encoding: To be rewritten: It is guaranteed to have transitions every other bit, meaning that decoding systems can adjust their clock/DC threshold continuously. One drawback is that it lacks easy human readability (e.g. on an oscilloscope).
Delay encoding is also known as Miller encoding (named after Armin Miller, its inventor).
Some RFID cards, in particular EPC UHF Gen 2 RF cards, use a variant called "Miller sub-carrier coding". In this system, 2, 4 or 8 cycles of a subcarrier square wave are transmitted for each bit time. The Miller encoding transitions are indicated by 180° phase shifts in the subcarrier, i.e. the subcarrier pauses for 1/2 of a cycle at each transition. (The resultant binary subcarrier is itself either ASK or PSK modulated on another carrier.)
As is standard when discussing hard drive encoding schemes, FM and MFM encodings produce a bit stream which is NRZI encoded when written to disk. A 1-bit represents a magnetic transition, and a 0-bit no transition. Data encoding has to balance two factors:
Both FM and MFM encodings can also be thought of as having data bits separated by clock bits, but with different rules for encoding the bits. Still, both formats encode each data bit as two bits on disk (because of delimiters that are required at the beginning and end of a sequence, the actual density is slightly lower).
The basic encoding rule for FM is that all clock bits are 1: zeros are encoded as 10, ones are encoded as 11. The number of magnetic transitions per bit is on average 1.5 (50%*1 + 50%*2).
The basic encoding rule for MFM is that (x, y, z, ...) encodes to (x, x NOR y, y, y NOR z, z, z NOR...). A zero is encoded as 10 if preceded by a zero, and 00 if preceded by a one (each of these cases occurs 25% of the time); a one is always encoded as 01 (which happens 50% of the time); thus the number of magnetic transitions is on average 0.75 (25%*1 + 25%*0 + 50%*1).
|Data||... 0 0 ...||... 0 1 ...||... 1 0 ...||... 1 1 ...|
|MFM clock bits||...? 1 ?...||...? 0 0...||...0 0 ?...||...0 0 0...|
Note that the surrounding clock bits are sometimes known, but sometimes require knowledge of the adjacent data bits. A longer example:
Data: 0 0 0 1 1 0 1 1 ... FM encoded: 10101011111011111... MFM clock: ? 1 1 0 0 0 0 0 0... MFM encoded: ?0101001010001010...
(The bold bits are the data bits, the others are the clock bits.)
In FM encoding, the number of 0-bits that may appear between consecutive 1-bits is either 0 or 1. In MFM encoding there is a minimum of 1 zero bit between adjacent ones (there are never two adjacent one bits), and the maximum number of zeros in a row is 3. Thus, FM is a (0,1) RLL code, while MFM is a (1,3) code.
A special “sync mark” is used to allow the disk controller to figure out where the data starts. This sync mark must follow the RLL code so that the controller can recognize it, but it does not follow the FM and MFM rules for clock bits. This way, it will never occur in any bit position in any encoded data stream. The shortest possible sync bit pattern, which follows the (1,3) RLL coding rules but cannot be produced by normal MFM coding, is 100010010001. In fact, the sync mark that is commonly used in MFM encoding starts with these twelve bits; it is called an “A1 sync” since the data bits form the start of the hexadecimal value A1 (10100001), but the fifth clock bit is different from the normal encoding of the A1 byte.
Data: 1 0 1 0 0 0 0 1 Clock: 0 0 0 1 1 1 0 Encoded: 100010010101001 Sync clock: 0 0 0 1 0 1 0 Sync Mark: 100010010001001 ^ Missing clock bit
MMFM, (Modified Modified Frequency Modulation), also abbreviated M²FM, or M2FM, is similar to MFM, but suppresses additional clock bits, producing a longer maximum run length (a (1,4) RLL code). In particular, a clock pulse is only inserted between a pair of adjacent 0-bits if the first bit of the pair did not have a clock pulse inserted before it. In the example below, clock bits that would have been present in MFM are noted in bold:
Data: 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 Clock: 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 Encoded: 01010001001001001000010010001001001000100001
In this system, sync marks are made by inserting additional clock pulses between adjacent zero bits (following the MFM rule) where they would normally be omitted. In particular, the data bit pattern "100001" has a clock pulse inserted in the middle, where it would normally be omitted:
Data: 1 0 0 0 0 1 Normal: 0 1 0 1 0 Sync: 0 1 1 1 0