Skip to content
ЦОС · Тема 6 · Филтрите в процесора

Числата в процесора и паразитните ефекти

Досега филтрите смятаха с безкрайно точни числа. В истинския процесор всяко число има ограничен брой битове. Пускаме думата „Здравей“ през такъв процесор и чуваме трите беди – шум от закръгляне, препълване и звук, който не спира.

≈ 5 мин четене∿ 6 живи уредаСамопроверка: 4 въпроса

Фиксирана запетая ​

В процесора числото е редица от битове. Най-левият е MSB (старшият), най-десният – LSB (младшият). В ЦОС най-често се ползват дробни числа с фиксирана запетая: един знаков бит и B − 1 бита след запетаята, т.е. числа от −1 до почти +1 със стъпка δ = 2⁻⁽ᴮ⁻¹⁾. При 8 бита: ±0,992, стъпка 1/128.

Ако някой коефициент е по-голям от 1, всички се нормират – делят се на степен на 2 (това е просто изместване на битовете), а изходът после се умножава обратно.

Число → битове
B = 6 бита (1 знаков + 5 дробни)
−0,40625₁₀ = −0,01101₂
Дробната част – умножаваме по 2, цялата част е битът (отпред назад):
  1. 0,40625 · 2 = 0,8125 → 0
  2. 0,8125 · 2 = 1,625 → 1
  3. 0,625 · 2 = 1,25 → 1
  4. 0,25 · 2 = 0,5 → 0
  5. 0,5 · 2 = 1 → 1
Код6 бита (знак + модул)
Прав1 01101
Обратен1 10010
Допълнителен1 10011
съкращаваме до 2 дробни бита (δ = 2−2 = 0,25)
МетодNqгрешка e = Nq − N
Закръгление−0,5−0,09375
Отсичане (допълнителен код)−0,5−0,09375
Отсичане (прав/обратен код)−0,250,15625
Фигура 1.

Превръщане на число в двоичен вид и трите кода за отрицателни числа. Пробвай −0,40625 с 6 бита и 0,1 (дробната част никога не свършва – затова 0,1 + 0,2 ≠ 0,3 и в JavaScript).

Отрицателни числа: прав, обратен и допълнителен код ​

Код−N е…−3 с 3 битаОсобеност
правзнаков бит 1 + модулът1 11две нули (+0 и −0)
обратенвсички битове на +N обърнати1 00две нули
допълнителенобратният + 11 01една нула; събирането работи само – ползва се навсякъде

Отсичане и закръгление ​

След умножение резултатът има повече битове, отколкото побира регистърът – излишните трябва да паднат. Закръглението взима най-близкото ниво; отсичането просто изрязва битовете. Тук думата се записва с 5 бита чрез отсичане (допълнителен код).

Средната грешка е −0,25·δ, а SNR = 12,8 dB. Отсичането в допълнителен код винаги закръгля надолу – средно с −δ/2, т.е. добавя постоянно отместване. В прав код отсича към нулата – грешката е двойно по-широка и шумът е 4 пъти по-силен (−6 dB, като загубен бит).

Думата: закръгление или отсичане
Входът: звукът, както е записан
020040060080010001200−101t – време, msx
входът x(n)
Изходът: звукът в регистъра
020040060080010001200−101t – време, msy
изходът y(n)
Фигура 2.

При 3–4 бита сравни трите на слух. Приближи тиха част: при отсичане в допълнителен код стълбицата е винаги под истинската линия.

Как е разпределена грешката
Плътност на грешката (20 000 случайни числа, δ = 2⁻⁸)
−1−0,500,5100,51e/δ – грешката в стъпкиp(e)
закръгление: m = 0,00002δ, σ² = 1·δ²/12 отсичане, допълнителен: m = −0,5δ, σ² = 0,99·δ²/12 отсичане, прав/обратен: m = 0,0018δ, σ² = 4·δ²/12
Фигура 3.

Грешката, измерена върху 20 000 числа: закръгление – равномерна в ±δ/2; отсичане в допълнителен код – в [−δ, 0]; в прав код – в [−δ, δ], затова дисперсията ѝ е 4 пъти по-голяма.

Препълване: насищане и увиване ​

Регистърът побира числа само до ±1. Ако думата стане 2 пъти по-силна, върховете ѝ не се побират – препълване. В допълнителен код твърде голямото число се увива: +1,1 става −0,9. Това е ужасна грешка – знакът се обръща. Затова процесорите за ЦОС насищат: числото просто спира на ±1.

Твърде силна дума в регистъра
Входът: звукът, както е записан
020040060080010001200−101t – време, msx
входът x(n)
Изходът: звукът след регистъра
020040060080010001200−101t – време, msy
изходът y(n)
Фигура 4.

Изходът е върнат на нормална сила, за да се сравнява. При увиване върховете „прескачат“ на другия край – чува се пращене. При насищане са само изрязани – звучи по-силно и малко грубо.

Паразитни ефекти и граничен цикъл ​

Във филтъра има четири места, където числата се закръглят: входът (АЦП), коефициентите, произведенията и изходът (ЦАП). Всяко внася грешка – това са паразитните ефекти. Най-изненадващият е в рекурсивния филтър: закръглянето в обратната връзка може да не му позволи да заглъхне.

Тук думата минава през резонатор (тема 3) с 8 бита; думата свършва около 650 ms, после е тишина. Сега след думата изходът продължава да трепти с амплитуда 0,016 – граничен цикъл.

Резонатор, който не спира
Входът: звукът, както е записан
020040060080010001200−101t – време, msx
входът x(n)
Изходът: звукът през резонатора
020040060080010001200−101t – време, msy
изходът y(n)
Фигура 5.

Пусни изхода при 6–8 бита и слушай края: след думата остава тих постоянен тон. Приближи опашката – трептенето е само няколко стъпки δ. При 14–16 бита заглъхва почти докрай.

Отблизо: биквад с B-битов регистър
B = 6 бита
a₁ = −1,6
a₂ = 0,9
импулс x(0) = 0,5

y(n) = x(n) − a₁·y(n−1) − a₂·y(n−2) · идеалният е устойчив

Биквад, 6 бита, насищане: ⚠ граничен цикъл с амплитуда 0,13
050100150−2−1012n – отчетy(n)
идеално (float) фиксирана запетая, 6 бита
Спектър на опашката (граничен цикъл = тесен пик)
00,10,20,30,40,5−500f/fs – нормирана честотаdB
опашката (n ≥ 40)
Фигура 6.

Сиво – идеалният филтър, синьо – с B-битов регистър, възбуден с импулс. При 6 бита опашката трепти завинаги (тесен пик в спектъра). С a₁ = −1,8, a₂ = 0,95 и импулс 0,9 без насищане числата се увиват – граничен цикъл с високо ниво (тема 7).

Пример: B = 12 бита, сигнал с мощност σx² = 0,1. Закръгление: SNR = 10,8 + 72 − 10 = 72,8 dB. Отсичане в прав код – с 6 dB по-малко.

Как се реализира ЦОС: на DSP процесор (софтуер, гъвкаво), на FPGA (паралелно, бързо) или в ASIC (собствен чип – най-евтино в милиони бройки).

Самопроверка ​

1. Какво е граничен цикъл?

Незатихващо трептене на изхода на БИХ филтър с фиксирана запетая при нулев вход – от закръглянето в обратната връзка.

2. Защо насищането е по-добро от увиването при препълване?

При увиване +1 става −1 – огромна грешка със сменен знак; насищането само изрязва върха.

3. Защо отсичането в допълнителен код добавя постоянно отместване?

То винаги закръгля надолу: грешката е в [−δ, 0], средно −δ/2.

4. −0,40625 с 6 бита в допълнителен код?

Прав 1 01101 → обратен 1 10010 → допълнителен 1 10011.