Выпуск #2/2020
О.Карандин, Е.Лицына, В.Лузинский, С.Портной
РАЗРАБОТКА ПОМЕХОУСТОЙЧИВОГО КОДЕКА ДЛЯ СИСТЕМЫ СВЯЗИ ПО ЛЭП
РАЗРАБОТКА ПОМЕХОУСТОЙЧИВОГО КОДЕКА ДЛЯ СИСТЕМЫ СВЯЗИ ПО ЛЭП
Просмотры: 1359
Реализация систем передачи телеметрии по ЛЭП затруднена из-за наличия шума и импульсных помех в канале связи, что требует применения кодов, корректирующих ошибки. Предлагается метод преобразования низкоплотностного (LDPC) кода, аналогичного применяемому в технологии DVB-S2, в код произвольной длины. Моделируется помехоустойчивость системы связи при использовании мягкого и жесткого декодеров.
Теги: conversion of low-density code etl communications systems noise immunity of a communication system помехоустойчивость системы связи преобразование низкоплотностного кода системы связи по лэп
Разработка помехоустойчивого кодека для системы связи по ЛЭП
О.Карандин, аспирант МИРЭА – Российский технологический университет /
karandin.oleg@gmail.com,
Е.Лицына, профессор Университета Ариэль (Ariel University) /
elitsyn@gmail.com,
В.Лузинский, к.т.н., доцент МИРЭА – Российский технологический университет /
luzinskiy@mirea.ru,
С.Портной, д.т.н., академик РАЕН, директор по развитию бизнеса компании "Комптек" /
serg.portnoy@gmail.com
УДК 621.391.8, DOI: 10.22184/2070-8963.2020.87.2.40.45
Реализация систем передачи телеметрии по ЛЭП затруднена из-за наличия шума и импульсных помех в канале связи, что требует применения кодов, корректирующих ошибки. Предлагается метод преобразования низкоплотностного (LDPC) кода, аналогичного применяемому в технологии DVB-S2, в код произвольной длины. Моделируется помехоустойчивость системы связи при использовании мягкого и жесткого декодеров.
Введение
Системы передачи информации по линиям электропередачи (Power Line Communication, PLC) широко используются для построения автоматизированных систем контроля и учета энергопотребления (АСКУЭ), а также для управления технологическими процессами в энергосистемах по всему миру [1]. Развитие инструментов телеметрии и внедрение новых сервисов требуют повышения пропускной способности таких систем.
Разработчики существующих стандартов PLC [2] стремятся к оптимальному использованию спектральных ресурсов канала связи, применяют технологию OFDM, которая позволяет выбирать различные схемы модуляции на разных поднесущих, адаптируясь к нестационарной частотной характеристике канала.
Передающийся по ЛЭП сигнал подвержен воздействию белого шума, импульсных помех от переходных процессов в электросети, а также интерференции от радиостанций, работающих в том же диапазоне частот. Характер передаваемых сообщений требует высокой помехоустойчивости канала связи, что достигается с помощью помехоустойчивого кодирования. Это также позволяет повысить спектральную эффективность системы связи.
В общепринятых стандартах [2] описано применение каскадного кода, первая ступень которого – код Рида-Соломона, а вторая – сверточный код. Данная схема кодирования является неудовлетворительной с точки зрения сложности декодера и энергетического выигрыша от кодирования.
Мы предлагаем использовать в качестве инструмента коррекции ошибок в системах PLC низкоплотностный код (Low Density Parity Check, LDPC).
LDPC-коды
Предложенные Робертом Галлагером в 1960 году LDPC-коды стали широко использоваться лишь в середине 1990-х годов вследствие роста вычислительной мощности устройств в системах связи.
LDPC – это линейный блоковый код с разреженной проверочной матрицей и большой длиной кодового слова. Использование LDPC-кода позволяет приблизиться к теоретической предельной пропускной способности канала.
Операция кодирования для низкоплотностных кодов представляет собой вычисление проверочных сумм по модулю два для множества групп битов отправляемого сообщения, которые далее передаются в канале вместе с ним. Код является систематическим.
Процедура декодирования реализуется как итеративное обновление вероятности того, что бит принятого сообщения равен 0 или 1. Для упрощения вычислений (сложение вместо умножения) используются логарифмы правдоподобия:
,
где p(x = 0/1) – вероятность того, что бит bi равен 0 или 1.
Существуют два основных подхода к декодированию – с использованием мягких или жестких решений. В мягком варианте декодеру доступна информация о величине синфазной и квадратурной составляющих принятого символа. Решения по значениям символов принимаются в процессе декодирования. Использование дополнительной информации значительно повышает точность процедуры. В жестком варианте декодер получает на входе значения битов, решения по значениям которых были ранее приняты демодулятором.
Начальные значения логарифмов правдоподобия для всех битов принятого сообщения при мягком декодировании вычисляются на основании принятого символа по известному алгоритму [3]. При жестком декодировании вероятность получения единицы принимается равной примерной вероятности битовой ошибки на входе декодера, то есть:
.
Для первичной оценки можно подсчитать частоту ошибок в последовательностях, передаваемых при синхронизации приемника и передатчика и заранее известных на стороне приемника. В дальнейшем это значение может обновляться с учетом числа исправленных декодером ошибок.
Каждая итерация в процедуре декодирования представляет собой обновление логарифмов правдоподобия битов сообщения, входящих в каждую проверочную сумму. Для этого вычисляются вероятности того, что конкретный бит сообщения равен 0 или 1 при фиксированных значениях логарифмов правдоподобия остальных битов, входящих в данную сумму. После обработки каждой проверочной суммы полученные для каждого бита логарифмы правдоподобия суммируются с исходным, принимается решение о равенстве бита 0 или 1, и проводится перерасчет четности проверочных сумм.
В результате этих итераций ошибки постепенно исправляются, и сообщение сходится к исходному [4].
Один из параметров алгоритма декодирования, позволяющий обменивать скорость работы декодера на число исправленных ошибок, – максимальное число итераций, обычно равное 40–50, хотя лишь в 1% случаев процедура декодирования требует максимального количества итераций. Второй параметр – число обновлений, применяемых к логарифму правдоподобия каждого бита. При обновлении логарифма правдоподобия можно учитывать не все проверочные суммы, а лишь λ наиболее информативных (алгоритм λ-min) или даже только одну (алгоритм min-sum).
Построение проверочной матрицы кода
Существуют различные подходы к построению проверочных матриц для LDPC-кодов. Показано, что даже случайно сгенерированная проверочная матрица позволяет достигнуть высокого качества декодирования [5].
Известно, что LDPC-коды характеризуются пороговым значением уровня шума, при превышении которого качество декодирования резко снижается. Оптимизация структуры проверочной матрицы позволяет обеспечить высокую эффективность декодирования даже при малых значениях отношения сигнал/шум.
LPDC-коды широко используются в различных стандартах связи. Хотя проверочные матрицы для этих кодов известны, они построены для одной или нескольких строго определенных длин кодового слова. Знание структуры проверочной матрицы может помочь модифицировать ее для требуемой длины кодового слова, сохраняя свойства кода, которые могут быть утеряны при простом усечении матрицы.
Рассмотрим код, аналогичный применяемому в стандарте цифрового спутникового телевидения DVB-S2 [6]. Будем использовать следующие параметры кода: размер кадра n = 64 800 бит, скорость кода r = 4/5 (на четыре информационных бита приходится один проверочный), длина информационной последовательности k = 51 840 бит.
После перестановки строк и столбцов матрицы согласно правилам, приведенным в [7], получим матрицу размером 51 840 × 64 800, состоящую из 6 480 блоков размером 360 × 360 (рис.1).
Большая часть из 6 480 блоков представляет собой нулевые матрицы. Штрихи на рис.1 соответствуют ненулевым блокам проверочной матрицы: 416 из них – это циклически сдвинутые единичные матрицы, 21 матрица содержит две единичные диагонали, три матрицы – три единичные диагонали, а матрица в правом верхнем углу (правый нижний угол на рис.1) является единичной с нулевой первой строкой.
Из рис.1 видно, что код является нерегулярным: первые 6 480 бит участвуют в 11 проверочных суммах, оставшиеся 45 360 бит информационной последовательности – в трех проверочных суммах, и, наконец, проверочные биты – в двух проверочных суммах каждый.
Удалив пять диагоналей, следующих через каждые 12 960 бит (рис.1), и вычислив значения сдвигов всех единичных матриц, получаем сжатое представление проверочной матрицы без потерь информации о ее структуре. Меняя размер блока, можем получать проверочную матрицу разного размера.
Напомним, что код является систематическим, и оставшаяся, шестая, диагональ в правой части матрицы соответствует проверочным битам.
Преобразуем данную матрицу для кодирования информационных последовательностей, не превышающих размер MTU для Ethernet-фрэймов, 1 500 байт (12 000 бит). Текущему значению k = 51 840 бит соответствует 51 840/360 = 144 блока. Уменьшив размер блока до 84 × 84, получим k = 144 × 84 = 12 096 бит (1 512 байт), что лишь на 12 байт превышает максимальную длину сообщений. При скорости кода r = 4/5 это будет соответствовать n = 15 120 бит (1 890 байт).
Для перехода от сжатого представления матрицы обратно к полному сгенерируем циклические сдвиги единичных матриц по модулю 84. Для 24 матриц с несколькими диагоналями проделаем эту операцию для каждой из них. Добавим пять диагоналей через каждые 12 960/360 × 84 = 3 024 бит и выполним обратную перестановку строк и столбцов.
В результате получим матрицу размером 12 096 × 15 120, имеющую аналогичное распределение числа проверочных сумм, приходящихся на каждый бит (рис.2), то есть структура кода сохранена.
В случаях, если поступающая в декодер информационная последовательность меньше 12 096 бит, кодовое слово будет по-прежнему содержать 3 024 проверочных бит, при условии, что биты, дополняющие информационную последовательность до 12 096, равны нулю. В реальности эти нулевые биты не передаются в канале.
В декодер вместе с полученным сообщением должна передаваться длина исходной информационной последовательности. Нулевые биты не декодируются, поэтому скорость работы декодера не снижается, а вносимая ими избыточность значительно увеличивает число исправленных ошибок.
Результаты
На рис.3, 4 приведены результаты моделирования работы кодера и декодера в гауссовском канале при использовании двоичной фазовой модуляции для различных значений отношения сигнал/шум и разных скоростей кода (различной длины информационной последовательности).
Правая кривая на обоих рисунках соответствует информационной последовательности полной длины 12 096 бит. Следующие кривые справа налево соответствуют информационной последовательности длины 9 072, 6 048 и 3 024 бит. Как уже отмечалось, по мере уменьшения длины сообщения избыточность возрастает, а с ней увеличивается и способность исправлять ошибки.
На рис.5, 6 представлено сравнение вероятностей ошибки в канале без кодирования и при использовании жесткого и мягкого декодеров.
Из сравнения кривых для жесткого и мягкого декодеров видно, что использование всей имеющейся информации о принятом символе позволяет получить дополнительный выигрыш в 2 дБ.
На рис.7 изображен энергетический выигрыш от применения кодирования для четырех описанных выше вариантов длины сообщения при жестком декодировании и для максимальной длины сообщения при мягком декодировании для различных вероятностей ошибки в бите на выходе декодера.
Заключение
По мере распространения систем телеметрии как основы концепции умного города используются каналы связи, характеризующиеся высоким уровнем шума и интерференции, такие как линии электропередачи. Для обеспечения надежной передачи сообщений и высокой спектральной эффективности необходимо применение помехоустойчивого кодирования. Трудности формирования современного кода с нужными параметрами заставляют использовать менее эффективные классические схемы кодирования.
Описанный в статье метод преобразования проверочной матрицы LDPC-кода, аналогичного применяемому в стандарте DVB-S2, позволяет получить матрицы для произвольной длины сообщений с сохранением структурных свойств кода.
ЛИТЕРАТУРА
Majumder A., Caffery J. Power line communication: An overview // Potentials IEEE. 2004. No. 23(4). P. 4–8.
Recommendation ITU-T G.9903. Narrowband orthogonal frequency division multiplexing power line communication transceivers for G3-PLC networks.
Ki Seol Kim et al. General Log-Likelihood Ratio Expression and Its Implementation Algorithm for Gray-Coded QAM Signals // ETRI Journal. 2006. Vol. 28. No. 3. P. 291–300.
Barry J.R., Messershmitt D.G., Lee E.A. Digital communication. Vol. I. 3rd Edition. – Springer. 2003. 838 p.
MacKay D.J.C. and Neal R.M. Near Shannon Limit Performance of Low Density Parity Check Codes // Electronics Letters. 1997. Vol. 33. No. 6. P. 457–458.
ETSI EN 302 307-1 V1.4.1 (2014-11). Digital Video Broadcasting (DVB); Second generation framing structure, channel coding andmodulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications. Part 1: DVB-S2.
Hanxiao Ge. Investigation of LDPC code in DVB-S2. Examensarbeteutförti Reglerteknik vid Tekniskahögskolani Linköping av. 2012. 72 p.
О.Карандин, аспирант МИРЭА – Российский технологический университет /
karandin.oleg@gmail.com,
Е.Лицына, профессор Университета Ариэль (Ariel University) /
elitsyn@gmail.com,
В.Лузинский, к.т.н., доцент МИРЭА – Российский технологический университет /
luzinskiy@mirea.ru,
С.Портной, д.т.н., академик РАЕН, директор по развитию бизнеса компании "Комптек" /
serg.portnoy@gmail.com
УДК 621.391.8, DOI: 10.22184/2070-8963.2020.87.2.40.45
Реализация систем передачи телеметрии по ЛЭП затруднена из-за наличия шума и импульсных помех в канале связи, что требует применения кодов, корректирующих ошибки. Предлагается метод преобразования низкоплотностного (LDPC) кода, аналогичного применяемому в технологии DVB-S2, в код произвольной длины. Моделируется помехоустойчивость системы связи при использовании мягкого и жесткого декодеров.
Введение
Системы передачи информации по линиям электропередачи (Power Line Communication, PLC) широко используются для построения автоматизированных систем контроля и учета энергопотребления (АСКУЭ), а также для управления технологическими процессами в энергосистемах по всему миру [1]. Развитие инструментов телеметрии и внедрение новых сервисов требуют повышения пропускной способности таких систем.
Разработчики существующих стандартов PLC [2] стремятся к оптимальному использованию спектральных ресурсов канала связи, применяют технологию OFDM, которая позволяет выбирать различные схемы модуляции на разных поднесущих, адаптируясь к нестационарной частотной характеристике канала.
Передающийся по ЛЭП сигнал подвержен воздействию белого шума, импульсных помех от переходных процессов в электросети, а также интерференции от радиостанций, работающих в том же диапазоне частот. Характер передаваемых сообщений требует высокой помехоустойчивости канала связи, что достигается с помощью помехоустойчивого кодирования. Это также позволяет повысить спектральную эффективность системы связи.
В общепринятых стандартах [2] описано применение каскадного кода, первая ступень которого – код Рида-Соломона, а вторая – сверточный код. Данная схема кодирования является неудовлетворительной с точки зрения сложности декодера и энергетического выигрыша от кодирования.
Мы предлагаем использовать в качестве инструмента коррекции ошибок в системах PLC низкоплотностный код (Low Density Parity Check, LDPC).
LDPC-коды
Предложенные Робертом Галлагером в 1960 году LDPC-коды стали широко использоваться лишь в середине 1990-х годов вследствие роста вычислительной мощности устройств в системах связи.
LDPC – это линейный блоковый код с разреженной проверочной матрицей и большой длиной кодового слова. Использование LDPC-кода позволяет приблизиться к теоретической предельной пропускной способности канала.
Операция кодирования для низкоплотностных кодов представляет собой вычисление проверочных сумм по модулю два для множества групп битов отправляемого сообщения, которые далее передаются в канале вместе с ним. Код является систематическим.
Процедура декодирования реализуется как итеративное обновление вероятности того, что бит принятого сообщения равен 0 или 1. Для упрощения вычислений (сложение вместо умножения) используются логарифмы правдоподобия:
,
где p(x = 0/1) – вероятность того, что бит bi равен 0 или 1.
Существуют два основных подхода к декодированию – с использованием мягких или жестких решений. В мягком варианте декодеру доступна информация о величине синфазной и квадратурной составляющих принятого символа. Решения по значениям символов принимаются в процессе декодирования. Использование дополнительной информации значительно повышает точность процедуры. В жестком варианте декодер получает на входе значения битов, решения по значениям которых были ранее приняты демодулятором.
Начальные значения логарифмов правдоподобия для всех битов принятого сообщения при мягком декодировании вычисляются на основании принятого символа по известному алгоритму [3]. При жестком декодировании вероятность получения единицы принимается равной примерной вероятности битовой ошибки на входе декодера, то есть:
.
Для первичной оценки можно подсчитать частоту ошибок в последовательностях, передаваемых при синхронизации приемника и передатчика и заранее известных на стороне приемника. В дальнейшем это значение может обновляться с учетом числа исправленных декодером ошибок.
Каждая итерация в процедуре декодирования представляет собой обновление логарифмов правдоподобия битов сообщения, входящих в каждую проверочную сумму. Для этого вычисляются вероятности того, что конкретный бит сообщения равен 0 или 1 при фиксированных значениях логарифмов правдоподобия остальных битов, входящих в данную сумму. После обработки каждой проверочной суммы полученные для каждого бита логарифмы правдоподобия суммируются с исходным, принимается решение о равенстве бита 0 или 1, и проводится перерасчет четности проверочных сумм.
В результате этих итераций ошибки постепенно исправляются, и сообщение сходится к исходному [4].
Один из параметров алгоритма декодирования, позволяющий обменивать скорость работы декодера на число исправленных ошибок, – максимальное число итераций, обычно равное 40–50, хотя лишь в 1% случаев процедура декодирования требует максимального количества итераций. Второй параметр – число обновлений, применяемых к логарифму правдоподобия каждого бита. При обновлении логарифма правдоподобия можно учитывать не все проверочные суммы, а лишь λ наиболее информативных (алгоритм λ-min) или даже только одну (алгоритм min-sum).
Построение проверочной матрицы кода
Существуют различные подходы к построению проверочных матриц для LDPC-кодов. Показано, что даже случайно сгенерированная проверочная матрица позволяет достигнуть высокого качества декодирования [5].
Известно, что LDPC-коды характеризуются пороговым значением уровня шума, при превышении которого качество декодирования резко снижается. Оптимизация структуры проверочной матрицы позволяет обеспечить высокую эффективность декодирования даже при малых значениях отношения сигнал/шум.
LPDC-коды широко используются в различных стандартах связи. Хотя проверочные матрицы для этих кодов известны, они построены для одной или нескольких строго определенных длин кодового слова. Знание структуры проверочной матрицы может помочь модифицировать ее для требуемой длины кодового слова, сохраняя свойства кода, которые могут быть утеряны при простом усечении матрицы.
Рассмотрим код, аналогичный применяемому в стандарте цифрового спутникового телевидения DVB-S2 [6]. Будем использовать следующие параметры кода: размер кадра n = 64 800 бит, скорость кода r = 4/5 (на четыре информационных бита приходится один проверочный), длина информационной последовательности k = 51 840 бит.
После перестановки строк и столбцов матрицы согласно правилам, приведенным в [7], получим матрицу размером 51 840 × 64 800, состоящую из 6 480 блоков размером 360 × 360 (рис.1).
Большая часть из 6 480 блоков представляет собой нулевые матрицы. Штрихи на рис.1 соответствуют ненулевым блокам проверочной матрицы: 416 из них – это циклически сдвинутые единичные матрицы, 21 матрица содержит две единичные диагонали, три матрицы – три единичные диагонали, а матрица в правом верхнем углу (правый нижний угол на рис.1) является единичной с нулевой первой строкой.
Из рис.1 видно, что код является нерегулярным: первые 6 480 бит участвуют в 11 проверочных суммах, оставшиеся 45 360 бит информационной последовательности – в трех проверочных суммах, и, наконец, проверочные биты – в двух проверочных суммах каждый.
Удалив пять диагоналей, следующих через каждые 12 960 бит (рис.1), и вычислив значения сдвигов всех единичных матриц, получаем сжатое представление проверочной матрицы без потерь информации о ее структуре. Меняя размер блока, можем получать проверочную матрицу разного размера.
Напомним, что код является систематическим, и оставшаяся, шестая, диагональ в правой части матрицы соответствует проверочным битам.
Преобразуем данную матрицу для кодирования информационных последовательностей, не превышающих размер MTU для Ethernet-фрэймов, 1 500 байт (12 000 бит). Текущему значению k = 51 840 бит соответствует 51 840/360 = 144 блока. Уменьшив размер блока до 84 × 84, получим k = 144 × 84 = 12 096 бит (1 512 байт), что лишь на 12 байт превышает максимальную длину сообщений. При скорости кода r = 4/5 это будет соответствовать n = 15 120 бит (1 890 байт).
Для перехода от сжатого представления матрицы обратно к полному сгенерируем циклические сдвиги единичных матриц по модулю 84. Для 24 матриц с несколькими диагоналями проделаем эту операцию для каждой из них. Добавим пять диагоналей через каждые 12 960/360 × 84 = 3 024 бит и выполним обратную перестановку строк и столбцов.
В результате получим матрицу размером 12 096 × 15 120, имеющую аналогичное распределение числа проверочных сумм, приходящихся на каждый бит (рис.2), то есть структура кода сохранена.
В случаях, если поступающая в декодер информационная последовательность меньше 12 096 бит, кодовое слово будет по-прежнему содержать 3 024 проверочных бит, при условии, что биты, дополняющие информационную последовательность до 12 096, равны нулю. В реальности эти нулевые биты не передаются в канале.
В декодер вместе с полученным сообщением должна передаваться длина исходной информационной последовательности. Нулевые биты не декодируются, поэтому скорость работы декодера не снижается, а вносимая ими избыточность значительно увеличивает число исправленных ошибок.
Результаты
На рис.3, 4 приведены результаты моделирования работы кодера и декодера в гауссовском канале при использовании двоичной фазовой модуляции для различных значений отношения сигнал/шум и разных скоростей кода (различной длины информационной последовательности).
Правая кривая на обоих рисунках соответствует информационной последовательности полной длины 12 096 бит. Следующие кривые справа налево соответствуют информационной последовательности длины 9 072, 6 048 и 3 024 бит. Как уже отмечалось, по мере уменьшения длины сообщения избыточность возрастает, а с ней увеличивается и способность исправлять ошибки.
На рис.5, 6 представлено сравнение вероятностей ошибки в канале без кодирования и при использовании жесткого и мягкого декодеров.
Из сравнения кривых для жесткого и мягкого декодеров видно, что использование всей имеющейся информации о принятом символе позволяет получить дополнительный выигрыш в 2 дБ.
На рис.7 изображен энергетический выигрыш от применения кодирования для четырех описанных выше вариантов длины сообщения при жестком декодировании и для максимальной длины сообщения при мягком декодировании для различных вероятностей ошибки в бите на выходе декодера.
Заключение
По мере распространения систем телеметрии как основы концепции умного города используются каналы связи, характеризующиеся высоким уровнем шума и интерференции, такие как линии электропередачи. Для обеспечения надежной передачи сообщений и высокой спектральной эффективности необходимо применение помехоустойчивого кодирования. Трудности формирования современного кода с нужными параметрами заставляют использовать менее эффективные классические схемы кодирования.
Описанный в статье метод преобразования проверочной матрицы LDPC-кода, аналогичного применяемому в стандарте DVB-S2, позволяет получить матрицы для произвольной длины сообщений с сохранением структурных свойств кода.
ЛИТЕРАТУРА
Majumder A., Caffery J. Power line communication: An overview // Potentials IEEE. 2004. No. 23(4). P. 4–8.
Recommendation ITU-T G.9903. Narrowband orthogonal frequency division multiplexing power line communication transceivers for G3-PLC networks.
Ki Seol Kim et al. General Log-Likelihood Ratio Expression and Its Implementation Algorithm for Gray-Coded QAM Signals // ETRI Journal. 2006. Vol. 28. No. 3. P. 291–300.
Barry J.R., Messershmitt D.G., Lee E.A. Digital communication. Vol. I. 3rd Edition. – Springer. 2003. 838 p.
MacKay D.J.C. and Neal R.M. Near Shannon Limit Performance of Low Density Parity Check Codes // Electronics Letters. 1997. Vol. 33. No. 6. P. 457–458.
ETSI EN 302 307-1 V1.4.1 (2014-11). Digital Video Broadcasting (DVB); Second generation framing structure, channel coding andmodulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications. Part 1: DVB-S2.
Hanxiao Ge. Investigation of LDPC code in DVB-S2. Examensarbeteutförti Reglerteknik vid Tekniskahögskolani Linköping av. 2012. 72 p.
Отзывы читателей