Цифровой фильтр

редактировать
Фильтр, используемый для дискретных сигналов при обработке сигналов Общий фильтр с конечной импульсной характеристикой с n каскады, каждый с независимой задержкой, d i, и коэффициентом усиления, i.

В обработке сигналов, цифровой фильтр представляет собой систему, которая выполняет математические вычисления. операции с дискретизированным, дискретным временем сигналом для уменьшения или усиления определенных аспектов этого сигнала. Это контрастирует с другим основным типом электронного фильтра, аналоговым фильтром, который представляет собой электронную схему, работающую в непрерывном времени аналоговые сигналы.

Система цифровой фильтрации обычно состоит из аналого-цифрового преобразователя (ADC) для выборки входного сигнала, за которым следует микропроцессор и некоторые периферийные компоненты, такие как память для хранить данные и коэффициенты фильтра и т. д. Программные инструкции (программное обеспечение), выполняемые на микропроцессоре, реализуют цифровой фильтр, выполняя необходимые математические операции над числами, полученными от АЦП. В некоторых высокопроизводительных приложениях используется FPGA или ASIC вместо микропроцессора общего назначения или специализированного процессора цифровых сигналов (DSP) со специальной параллельной архитектурой. для ускорения таких операций, как фильтрация.

Цифровые фильтры могут быть более дорогими, чем эквивалентные аналоговые фильтры из-за их повышенной сложности, но они делают практичным многие конструкции, которые непрактичны или невозможны в качестве аналоговых фильтров. Цифровые фильтры часто могут быть изготовлены очень высокого порядка и часто представляют собой фильтры с конечной импульсной характеристикой, что позволяет получить характеристику с линейной фазой. При использовании в контексте аналоговых систем реального времени цифровые фильтры иногда имеют проблемную задержку (разницу во времени между входом и откликом) из-за связанных аналого-цифровых и цифровых -в аналоговые преобразования и фильтры сглаживания, или из-за других задержек в их реализации.

Цифровые фильтры - обычное дело и важный элемент повседневной электроники, такой как радио, мобильные телефоны и AV-ресиверы.

Содержание

  • 1 Характеристики
    • 1.1 Методы анализа
      • 1.1.1 Импульсная характеристика
      • 1.1.2 Разностное уравнение
  • 2 Конструкция фильтра
  • 3 Реализация фильтра
    • 3.1 Прямая форма I
    • 3.2 Прямая форма II
    • 3.3 Каскадные секции второго порядка
    • 3.4 Другие формы
  • 4 Сравнение аналоговых и цифровых фильтров
  • 5 Типы цифровых фильтров
  • 6 См. Также
  • 7 Ссылки
  • 8 Дополнительная литература

Характеристика

Цифровой фильтр характеризуется своей передаточной функцией или, что эквивалентно, его разностным уравнением. Математический анализ передаточной функции может описать, как она будет реагировать на любой ввод. Таким образом, проектирование фильтра состоит из разработки спецификаций, соответствующих проблеме (например, фильтра нижних частот второго порядка с определенной частотой среза), а затем создания передаточной функции, которая соответствует спецификациям.

Передаточная функция для линейного, не зависящего от времени цифрового фильтра может быть выражена как передаточная функция в Z-области ; если это причинно, то оно имеет вид:

H (z) = B (z) A (z) = b 0 + b 1 z - 1 + b 2 z - 2 + ⋯ + b N z - N 1 + a 1 z - 1 + a 2 z - 2 + ⋯ + a M z - M {\ displaystyle H (z) = {\ frac {B (z)} {A (z)}} = {\ frac { b_ {0} + b_ {1} z ^ {- 1} + b_ {2} z ^ {- 2} + \ cdots + b_ {N} z ^ {- N}} {1 + a_ {1} z ^ {-1} + a_ {2} z ^ {- 2} + \ cdots + a_ {M} z ^ {- M}}}}H (z) = {\ frac {B (z)} {A (z)}} = {\ frac {{b _ {{0}} + b _ {{1}} z ^ {{- 1}} + b _ {{2}} z ^ {{- 2}} + \ cdots + b _ {{N}} z ^ {{- N}}}} {{1 + a _ {{1}} z ^ {{- 1}} + a _ {{2}} z ^ {{- 2 }} + \ cdots + a _ {{M}} z ^ {{- M}}}}}

где порядок фильтра больше N или M. См. Уравнение LCCD Z-преобразования для дальнейшего обсуждения этой передаточной функции.

Это форма для рекурсивного фильтра, который обычно приводит к БИХ бесконечному импульсу поведение ответа, но если знаменатель сделан равным единице, т.е. без обратной связи, тогда это становится фильтром КИХ или конечной импульсной характеристикой.

Методы анализа

Для анализа поведения данного цифрового фильтра можно использовать различные математические методы. Многие из этих методов анализа также могут использоваться в проектах и ​​часто составляют основу спецификации фильтра.

Как правило, фильтры характеризуют, вычисляя, как они будут реагировать на простой входной сигнал, такой как импульс. Затем можно расширить эту информацию, чтобы вычислить реакцию фильтра на более сложные сигналы.

Импульсная характеристика

Импульсная характеристика, часто обозначаемая как h [k] {\ displaystyle h [k]}h [k] или hk {\ displaystyle h_ {k}}h_ {k} , это измерение того, как фильтр будет реагировать на дельта-функцию Кронекера. Например, для разностного уравнения можно установить x 0 = 1 {\ displaystyle x_ {0} = 1}x_ {0} = 1 и xk = 0 {\ displaystyle x_ {k} = 0 }x_{k}=0для k ≠ 0 {\ displaystyle k \ neq 0}k \ neq 0 и оцените. Импульсная характеристика - это характеристика поведения фильтра. Цифровые фильтры обычно делятся на две категории: бесконечная импульсная характеристика (IIR) и конечная импульсная характеристика (FIR). В случае линейных КИХ-фильтров, не зависящих от времени, импульсная характеристика точно равна последовательности коэффициентов фильтра, и, таким образом:

yn = ∑ k = 0 N bkxn - k = ∑ k = 0 N hkxn - k { \ displaystyle \ y_ {n} = \ sum _ {k = 0} ^ {N} b_ {k} x_ {nk} = \ sum _ {k = 0} ^ {N} h_ {k} x_ {nk}}{\ displaystyle \ y_ {n} = \ sum _ {k = 0} ^ {N} b_ {k} x_ {nk} = \ sum _ {k = 0} ^ {N} h_ {k} x_ {nk}}

БИХ-фильтры, с другой стороны, рекурсивны, причем выход зависит как от текущего, так и от предыдущих входов, а также от предыдущих выходов. Общая форма БИХ-фильтра такова:

∑ m = 0 M amyn - m = ∑ k = 0 N bkxn - k {\ displaystyle \ \ sum _ {m = 0} ^ {M} a_ {m} y_ {nm} = \ sum _ {k = 0} ^ {N} b_ {k} x_ {nk}}{\ displaystyle \ \ sum _ {m = 0} ^ {M} a_ {m} y_ {nm} = \ sum _ {k = 0} ^ {N} b_ {k} x_ {nk}}

Построение импульсного отклика покажет, как фильтр будет реагировать на внезапное мгновенное возмущение. БИХ-фильтр всегда будет рекурсивным. Хотя рекурсивный фильтр может иметь конечную импульсную характеристику, нерекурсивные фильтры всегда будут иметь конечную импульсную характеристику. Примером может служить фильтр скользящего среднего (MA), который может быть реализован как рекурсивно, так и нерекурсивно.

Разностное уравнение

В системах с дискретным временем цифровой фильтр часто реализуется путем преобразования передаточной функции в линейную константу -уравнение разности коэффициентов (LCCD) через Z-преобразование. Дискретная передаточная функция в частотной области записывается как отношение двух полиномов. Например:

H (z) = (z + 1) 2 (z - 1 2) (z + 3 4) {\ displaystyle H (z) = {\ frac {(z + 1) ^ {2} } {(z - {\ frac {1} {2}}) (z + {\ frac {3} {4}})}}}H (z) = {\ frac {(z + 1) ^ {2}} {(z - {\ frac {1} {2}}) (z + {\ frac {3} {4}})}}

Это раскрыто:

H (z) = z 2 + 2 z + 1 z 2 + 1 4 z - 3 8 {\ displaystyle H (z) = {\ frac {z ^ {2} + 2z + 1} {z ^ {2} + {\ frac {1} {4 }} z - {\ frac {3} {8}}}}}H (z) = {\ frac {z ^ {2} + 2z + 1} {z ^ {2} + {\ frac {1} {4}} z - {\ frac {3} {8}}}}

и чтобы сделать соответствующий фильтр причинным, числитель и знаменатель делятся на наивысший порядок z { \ displaystyle z}z :

H (z) = 1 + 2 z - 1 + z - 2 1 + 1 4 z - 1 - 3 8 z - 2 = Y (z) X (z) {\ displaystyle H (z) = {\ frac {1 + 2z ^ {- 1} + z ^ {- 2}} {1 + {\ frac {1} {4}} z ^ {- 1} - {\ frac {3} {8 }} z ^ {- 2}}} = {\ frac {Y (z)} {X (z)}}}H (z) = {\ frac {1 + 2z ^ {{- 1}} + z ^ {{- 2}}} {1+ {\ frac {1} {4}} z ^ {{- 1}} - {\ frac {3} {8}} z ^ {{- 2}}}} = {\ frac {Y (z)} { X (z)}}

Коэффициенты знаменателя, ak {\ displaystyle a_ {k}}a_ {k} , являются коэффициентами «обратной связи», а коэффициенты числителя - коэффициентами «прямой связи», bk {\ displaystyle b_ {k}}b _ {{k}} . Результирующее уравнение линейной разности :

y [n] = - ∑ k = 1 M aky [n - k] + ∑ k = 0 N bkx [n - k] {\ displaystyle y [ n] = - \ sum _ {k = 1} ^ {M} a_ {k} y [nk] + \ sum _ {k = 0} ^ {N} b_ {k} x [nk]}y [n] = - \ sum _ {{k = 1}} ^ {{M }} a _ {{k}} y [nk] + \ sum _ {{k = 0}} ^ {{N}} b _ {{k}} x [nk]

или, для примера выше:

Y (z) X (z) = 1 + 2 z - 1 + z - 2 1 + 1 4 z - 1 - 3 8 z - 2 {\ displaystyle {\ frac {Y ( z)} {X (z)}} = {\ frac {1 + 2z ^ {- 1} + z ^ {- 2}} {1 + {\ frac {1} {4}} z ^ {- 1} - {\ frac {3} {8}} z ^ {- 2}}}}{\ frac {Y (z)} {X ( z)}} = {\ frac {1 + 2z ^ {{- 1}} + z ^ {{- 2}}} {1 + {\ frac {1} {4}} z ^ {{- 1}} - {\ frac {3} {8}} z ^ {{- 2}}}}

перестановка членов:

⇒ (1 + 1 4 z - 1 - 3 8 z - 2) Y (z) = (1 + 2 z - 1 + z - 2) Икс (z) {\ displaystyle \ Rightarrow (1 + {\ frac {1} {4}} z ^ {- 1} - {\ frac {3} {8}) } z ^ {- 2}) Y (z) = (1 + 2z ^ {- 1} + z ^ {- 2}) X (z)}\ Rightarrow (1 + {\ frac {1} {4}} z ^ {{- 1}} - {\ frac {3} {8}} z ^ {{- 2}}) Y (z) = ( 1 + 2z ^ {{- 1}} + z ^ {{- 2}}) X (z)

затем, взяв обратное z-преобразование:

⇒ y [n] + 1 4 y [n - 1] - 3 8 y [n - 2] = x [n] + 2 x [n - 1] + x [n - 2] {\ displaystyle \ Rightarrow y [ n] + {\ frac {1} {4}} y [n-1] - {\ frac {3} {8}} y [n-2] = x [n] + 2x [n-1] + x [n-2]}\ Rightarrow y [n] + {\ frac {1} {4}} y [n-1 ] - {\ frac {3 } {8}} y [n-2] = x [n] + 2x [n-1] + x [n-2]

и, наконец, решив для y [n] {\ displaystyle y [n]}y [n] :

y [n] = - 1 4 y [n - 1] + 3 8 y [n - 2] + x [n] + 2 x [n - 1] + x [n - 2] {\ displaystyle y [n] = - {\ frac {1} {4}} y [n-1] + {\ frac {3} {8}} y [n-2] + x [n] + 2x [n-1] + x [n-2]}y [n] = - {\ frac {1} {4}} y [ n-1] + {\ frac {3} {8}} y [n-2] + x [n] + 2x [n-1] + x [n-2]

Это уравнение показывает, как вычислить следующий выходной образец, y [n] {\ displaystyle y [n]}y [n] , с точки зрения прошлых выходов, y [n - p] {\ displaystyle y [np]}y [np] , текущий ввод, x [n] {\ displaystyle x [n]}x [n] , и прошлые входные данные, x [n - p] {\ displaystyle x [np]}x [np] . Применение фильтра к входу в этой форме эквивалентно реализации Direct Form I или II (см. Ниже), в зависимости от точного порядка оценки.

Проще говоря, например, как используется программистом, реализующим вышеуказанное уравнение в коде, его можно описать следующим образом:

y {\ displaystyle y}y = the вывод или отфильтрованное значение. x {\ displaystyle x}x = ввод или входящее необработанное значение. n {\ displaystyle n}n = номер выборки, номер итерации или номер периода времени

и, следовательно:

y [n] {\ displaystyle y [n]}y [n] = текущее отфильтрованное (выходное) значение. y [n - 1] {\ displaystyle y [n-1]}y [n-1] = последнее отфильтрованное (выходное) значение. y [n - 2] {\ displaystyle y [n-2]}{\ displaystyle y [n-2]} = предпоследнее отфильтрованное (выходное) значение. x [n] {\ displaystyle x [n]}x [n] = текущее исходное входное значение. x [n - 1] {\ displaystyle x [n-1]}{\ displaystyle x [n-1]} = последнее исходное входное значение. x [n - 2 ] {\ displaystyle x [n-2]}{\ displaystyle x [n-2]} = предпоследнее необработанное входное значение

Дизайн фильтра

Дизайн цифровых фильтров обманчиво совпадает сложная тема. Хотя фильтры легко понять и рассчитать, практические проблемы их проектирования и реализации значительны и являются предметом самых передовых исследований.

Существует две категории цифровых фильтров: рекурсивный фильтр и нерекурсивный фильтр. Их часто называют фильтрами с бесконечной импульсной характеристикой (IIR) и фильтрами с конечной импульсной характеристикой (FIR) соответственно.

Реализация фильтра

После того, как фильтр спроектирован, он должен быть реализован путем разработки схемы потока сигналов, которая описывает фильтр с точки зрения операций над последовательностями выборок.

Заданная передаточная функция может быть реализована разными способами. Подумайте, как можно вычислить простое выражение, такое как ax + bx + c {\ displaystyle ax + bx + c}ax + bx + c - можно также вычислить эквивалентное x (a + b) + с {\ Displaystyle х (а + Ь) + с}x (a + b) + c . Таким же образом все реализации могут рассматриваться как «факторизации» одной и той же передаточной функции, но разные реализации будут иметь разные числовые свойства. В частности, некоторые реализации более эффективны с точки зрения количества операций или элементов памяти, необходимых для их реализации, а другие обеспечивают такие преимущества, как улучшенная числовая стабильность и уменьшенная ошибка округления. Некоторые структуры лучше подходят для арифметики с фиксированной точкой, а другие могут быть лучше для арифметики с плавающей точкой.

Прямая форма I

Прямой подход к реализации БИХ-фильтра: прямая форма I, где разностное уравнение вычисляется напрямую. Эта форма практична для небольших фильтров, но может быть неэффективной и непрактичной (численно нестабильной) для сложных конструкций. В общем, эта форма требует 2N элементов задержки (как для входных, так и для выходных сигналов) для фильтра порядка N.

Биквадратный фильтр DF-I.svg

Прямая форма II

Альтернативная прямая форма II требует только N единицы задержки, где N - порядок фильтра - потенциально вдвое меньше, чем в прямой форме I. Эта структура получается путем изменения порядка разделов числителя и знаменателя в прямой форме I, поскольку они фактически являются двумя линейными системами, и свойство коммутативности применяется. Затем можно заметить, что есть два столбца задержек (z - 1 {\ displaystyle z ^ {- 1}}z ^ {- 1} ), которые выходят из центральной цепи, и их можно объединить, поскольку они избыточны, что приводит к реализации, показанной ниже.

Недостатком является то, что прямая форма II увеличивает возможность арифметического переполнения для фильтров с высокой добротностью или резонансом. Было показано, что с увеличением Q шум округления в обеих топологиях прямой формы неограниченно возрастает. Это связано с тем, что, по идее, сигнал сначала проходит через многополюсный фильтр (который обычно увеличивает усиление на резонансных частотах), прежде чем результат этого становится насыщенным, а затем проходит через нулевой фильтр (который часто ослабляет большую часть того, что всеполюсная половина усиливается).

Биквадратный фильтр DF-II.svg

Каскадные секции второго порядка

Распространенной стратегией является реализация цифрового фильтра более высокого порядка (больше 2) в виде каскадной серии «биквадратрических» (или «биквадратных») секций второго порядка ( см. цифровой биквадратный фильтр ). Преимущество этой стратегии в том, что диапазон коэффициентов ограничен. Каскадирование секций прямой формы II приводит к N элементов задержки для фильтров порядка N. Каскадирование секций прямой формы I приводит к N + 2 элементам задержки, так как элементы задержки входа любой секции (кроме первой секции) являются избыточными с задержкой. элементы вывода предыдущего раздела.

Другие формы

Другие формы включают:

  • Прямая форма I и II, транспонированная
  • Последовательный / каскадный нижний (типичный второй) порядок подразделов
  • Параллельно подразделы нижнего (типичного второго) порядка
    • Расширение непрерывной дроби
  • Решетка и лестница
    • Одно-, двух- и трехкратные решетчатые формы
    • Трех- и четырехкратная нормализованная лестница формирует
    • структуры ARMA
  • структуры пространства состояний:
    • оптимальные (в смысле минимального шума): (N + 1) 2 {\ displaystyle (N + 1) ^ {2}}(N + 1) ^ {2} параметры
    • оптимальные для блока и оптимальные для раздела: 4 N - 1 {\ displaystyle 4N-1}4N-1 параметры
    • вход, сбалансированный с вращением Гивенса: 4 N - 1 {\ displaystyle 4N-1}4N-1 параметры
  • Связанные формы: Gold Rader (нормальный), State Variable (Chamberlin), Kingsbury, Modified State Variable, Zölzer, Modified Zölzer
  • Wave Digital Filters (WDF)
  • Agarwal – Burrus (1AB и 2AB)
  • Harris – Brooking
  • ND- TDL
  • Му ltifeedback
  • Аналоговые формы, такие как ключи Саллена и фильтры переменных состояния
  • Систолические массивы

Сравнение аналоговых и цифровых фильтров

Компонент цифровых фильтров не распространяется. линейности, которые значительно усложняют конструкцию аналоговых фильтров. Аналоговые фильтры состоят из несовершенных электронных компонентов, значения которых указаны с предельным допуском (например, значения резисторов часто имеют допуск ± 5%) и которые также могут изменяться в зависимости от температуры и дрейфа со временем. По мере увеличения порядка аналогового фильтра и, следовательно, количества его компонентов, влияние ошибок переменных компонентов значительно усиливается. В цифровых фильтрах значения коэффициентов хранятся в памяти компьютера, что делает их гораздо более стабильными и предсказуемыми.

Поскольку коэффициенты цифровых фильтров являются определенными, их можно использовать для достижения гораздо более сложных и избирательных схем, в частности с цифровыми фильтрами можно добиться более низкой пульсации полосы пропускания, более быстрого перехода и более высокого затухания в полосе задерживания, чем это практично с аналоговыми фильтрами. Даже если бы конструкция могла быть достигнута с использованием аналоговых фильтров, инженерные затраты на разработку эквивалентного цифрового фильтра, вероятно, были бы намного ниже. Более того, можно легко изменить коэффициенты цифрового фильтра, чтобы создать адаптивный фильтр или параметрический фильтр, управляемый пользователем. Хотя эти методы возможны в аналоговом фильтре, они снова значительно сложнее.

Цифровые фильтры могут использоваться при разработке фильтров с конечной импульсной характеристикой. Эквивалентные аналоговые фильтры часто более сложны, поскольку для них требуются элементы задержки.

Цифровые фильтры в меньшей степени полагаются на аналоговую схему, потенциально обеспечивая лучшее отношение сигнал / шум. Цифровой фильтр будет вносить шум в сигнал во время аналоговой фильтрации нижних частот, аналого-цифрового преобразования, цифро-аналогового преобразования и может вносить цифровой шум из-за квантования. В аналоговых фильтрах каждый компонент является источником теплового шума (например, шум Джонсона ), поэтому с ростом сложности фильтра растет и шум.

Однако цифровые фильтры действительно увеличивают задержку в основной части системы. В аналоговом фильтре задержка часто незначительна; строго говоря, это время для распространения электрического сигнала через схему фильтра. В цифровых системах задержка вводится элементами задержки в тракте цифрового сигнала, а также аналого-цифровыми и цифро-аналоговыми преобразователями, которые позволяют системе обрабатывать аналоговые сигналы..

В очень простых случаях более рентабельно использовать аналоговый фильтр. Введение цифрового фильтра требует значительных накладных расходов схемы, как обсуждалось ранее, включая два аналоговых фильтра нижних частот.

Еще один аргумент в пользу аналоговых фильтров - низкое энергопотребление. Аналоговые фильтры требуют значительно меньшей мощности и поэтому являются единственным решением при жестких требованиях к питанию.

При создании электрической схемы на печатной плате, как правило, проще использовать цифровое решение, поскольку блоки обработки данных сильно оптимизировались с годами. Создание такой же схемы с аналоговыми компонентами заняло бы намного больше места при использовании дискретных компонентов. Двумя альтернативами являются FPAA и ASIC, но они дороги для небольших объемов.

Типы цифровых фильтров

Многие цифровые фильтры основаны на быстром преобразовании Фурье, математическом алгоритме, который быстро извлекает частотный спектр сигнал, позволяющий манипулировать спектром (например, создавать полосовые фильтры очень высокого порядка) перед преобразованием модифицированного спектра обратно в сигнал временного ряда с помощью операции обратного БПФ. Эти фильтры дают O (n log n) вычислительные затраты, тогда как обычные цифровые фильтры имеют тенденцию быть O (n).

Другой формой цифрового фильтра является модель пространства состояний. Хорошо используемый фильтр в пространстве состояний - это фильтр Калмана, опубликованный Рудольфом Калманом в 1960 году.

Традиционные линейные фильтры обычно основаны на затухании. В качестве альтернативы могут быть разработаны нелинейные фильтры, включая фильтры передачи энергии, которые позволяют пользователю перемещать энергию определенным образом. Таким образом, нежелательные шумы или эффекты могут быть перемещены в новые полосы частот с более низкой или высокой частотой, распределены по диапазону частот, разделены или сфокусированы. Фильтры для передачи энергии дополняют традиционные конструкции фильтров и предоставляют гораздо больше степеней свободы в конструкции фильтров. Цифровые фильтры передачи энергии относительно легко спроектировать, реализовать и использовать нелинейную динамику.

Есть различные способы характеризовать фильтры; например:

  • Линейный фильтр - это линейное преобразование входных отсчетов; остальные фильтры нелинейные. Линейные фильтры удовлетворяют принципу наложения , т. Е. Если вход представляет собой взвешенную линейную комбинацию различных сигналов, выход представляет собой линейную комбинацию соответствующих выходных сигналов с одинаковым весом.
  • Причинный фильтр использует только предыдущие выборки входных или выходных сигналов; в то время как фильтр без причинности использует будущие входные выборки. Непричинный фильтр обычно можно превратить в причинный, добавив к нему задержку.
  • Неизменяемый во времени фильтр имеет постоянные свойства во времени; другие фильтры, такие как адаптивные фильтры, изменяются во времени.
  • Стабильный фильтр выдает выходной сигнал, который со временем сходится к постоянному значению или остается ограниченным в пределах конечного интервала. Нестабильный фильтр может давать выходной сигнал, который неограниченно растет, с ограниченным или даже нулевым входным сигналом.
  • A Фильтр с конечной импульсной характеристикой (FIR) использует только входные сигналы, а бесконечный импульсный отклик ( IIR) фильтр использует как входной сигнал, так и предыдущие отсчеты выходного сигнала. КИХ-фильтры всегда стабильны, в то время как БИХ-фильтры могут быть нестабильными.

Фильтр может быть представлен блок-схемой , которую затем можно использовать для получения алгоритма обработки выборки для реализовать фильтр с помощью аппаратных инструкций. Фильтр также может быть описан как уравнение разности, набор нулей и полюсов или импульсная характеристика или переходная характеристика.

См. Также

Литература

Дополнительная литература

Последняя правка сделана 2021-05-17 05:58:05
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте