реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Алгоритм поиска основной частоты, Метод максимального правдоподобия
QuickNick
сообщение Jul 1 2011, 06:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Здравствуйте, товарищи.

Мне нужно улучшить алгоритм поиска основной частоты по методу максимального правдоподобия. Был пример у меня, как делать, я его модифицировал в нескольких местах (добавил настраиваемость оконной функции и фильтра). Возможно, некоторые места вам покажутся совершенно абсурдными - но я пока новичок в DSP, некоторые места в старом алгоритме вызывают у меня сильное удивление, но пока не хватает опыта для однозначного решения: или я не понимаю момент, или предыдущий программист допустил косяк.

- Вход: массив байтов byteData длиной sampleLength, количество разбиений sampleRate.
- Выход: фундаментальная частота fundamentalFrequency и громкость fundamentalVolume.

Алгоритм:
1. Массив байтов преобразуется в вешественный массив амплитуд.
2. Проверяется максимальная амплитуда - если она ниже определённого значения, то это квалифицируется как почти полная тишина (выход из алгоритма)
3. Получение спектра из массива амплитуд:
3.1. Умножение массива амплитуд на оконную функцию;
3.2. Преобразование Фурье.
4. Фильтрация массива спектральных значений.
5. Расчёт массива громкости (модуль от спектральных значений).
6. Нормализация громкости:
6.1. Поиск максимальной громкости (maxVolume).
6.2. Нормализация (volume[i] = volume[i]/maxVolume);
7. Квалификация спектра как информативного или зашумлённого.
8. Инициализация 3 пиков громкости и соответствующих им частот.
9. Поиск фундаментальной частоты.
9.1. Если один из 2 главных пиков громкости ниже некоторого порога громкости, то выбрать частоту другого главного пика, выход из алгоритма.
9.2. Поиск фундаментальной частоты по 2 главным пикам согласно известным пропорциям 1/2, 1/3, 2/3, 2/5, 3/4, 3/5.
9.3. Коррекция фундаментальной частоты по 3-му пику.

Мне нужно пробежаться по некоторым пунктам, чтобы удостовериться в валидности алгоритма.
Пункты 1, 2, 6, 8 и 9 вопросов не вызывают.

Самые горячие вопросы сейчас такие:
1. Правильно ли считается громкость? Массив спектральных значений имеет следующую структуру: в ячейках spectre[2*i] лежат коэффициэнты при косинусах, в spectre[2*i+1] лежат коэффициэнты при синусах. Соответственно, громкость считаю так: volume[i] = sqrt(sqr(spectre[2*i])+sqr(spectre[2*i+1])); Может, таким методом не громкость считается, а что-то другое?
2. Как рассчитать шум? И как рассчитать порог шума (если его превысить, то выход из алгоритма)? Сейчас шум рассчитывается как среднее арифметическое по массиву громкости.

Сообщение отредактировал QuickNick - Jul 1 2011, 07:00
Go to the top of the page
 
+Quote Post
qxov
сообщение Jul 1 2011, 11:54
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



Описано много всего. Зачем все это делается - не понятно. Считаем, что требуется все-таки выполнить оценку частоты и амплитуды гармонического сигнала. Требования к качеству оценки не предъявляются. Таким образом, решение - накопить достаточное количество отсчетов сигнала и взять БПФ от них. Получите оценку частоты, начальной фазы и амплитуды.

Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 1 2011, 12:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(qxov @ Jul 1 2011, 14:54) *
Описано много всего. Зачем все это делается - не понятно. Считаем, что требуется все-таки выполнить оценку частоты и амплитуды гармонического сигнала. Требования к качеству оценки не предъявляются. Таким образом, решение - накопить достаточное количество отсчетов сигнала и взять БПФ от них. Получите оценку частоты, начальной фазы и амплитуды.

Нужно в реальном времени давать частоту сигнала.
То, что БПФ надо брать - это понятно.
У меня вопросы только по конкретным шагам - насколько они валидны.

Собственно, я нашёл решение по шагу 7. Посчитать среднее арифметическое по громкости в полосе фильтрации, сравнить его с пиком громкости. Если шум составляет >10% от всей информации, то далее последовательность не обрабатывать.
Для этого я шаги 7 и 8 местами поменял.

Алгоритм работает, всем спасибо за сочувствие!
Go to the top of the page
 
+Quote Post
SPACUM
сообщение Jul 1 2011, 13:58
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531



Цитата(QuickNick @ Jul 1 2011, 10:56) *
Мне нужно улучшить алгоритм поиска основной частоты

1.Во первыых терминология. До БПФ массив называется сигнал или выборка и алгоритм получения выборки не имеет отношения к заданным вопросам. После БПФ массив называется спектр, он комплексный Re и Im. После взятия корня из суммы квадратов получается массив амплитуд гармоник Фурье.
2.Термин "громкость" уже обсуждался и оказалось громкость = максимальная амплитуда.
3.На тему "поиск основной частоты" опубликовано множество работ и продолжает публиковаться. Это означает, что удовлетворяющий всех алгоритм не найден. Но существует множество приближений от самых простых приведенных в работах Куцукоса(Peter Kootsookos) до весьма сложных (Quinn, M. Macleod). Так что вполне можете придумать свой.
Можете поискать по словам "estimation" "estimation frequency" "funamental frequency" там много.
4.Рекомендую попробовать такой метод: Окно Гаусса->БПФ->Определить основные вершины->Уточнить вершины по трем точкам.
5.В измерении шума всегда используют критерий мощности. Возвести каждое значение сигнала в квадрат просуммировать разделить на количество и извлечь корень. Или возвести каждое значение амплитуды спектра в квадрат просуммировать и извлечь корень. (Делить не надо). Эти значения должны быть равны.


--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jul 1 2011, 14:33
Сообщение #5


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(QuickNick @ Jul 1 2011, 09:56) *
8. Инициализация 3 пиков громкости и соответствующих им частот.
9. Поиск фундаментальной частоты.
9.1. Если один из 2 главных пиков громкости ниже некоторого порога громкости, то выбрать частоту другого главного пика, выход из алгоритма.
9.2. Поиск фундаментальной частоты по 2 главным пикам согласно известным пропорциям 1/2, 1/3, 2/3, 2/5, 3/4, 3/5.
9.3. Коррекция фундаментальной частоты по 3-му пику.

...бред какой-то )))... Вам нужно удостовериться, что главный пик это голос а потому имеет "ощутимую" 2-ую и третью гармоники...

Цитата(SPACUM @ Jul 1 2011, 16:58) *
5.В измерении шума всегда используют критерий мощности...

...в измерении - возможно, но не в оценке - уж точно... Именно математический формализм отъедает основные "мипсы" в прожектах новичков wink.gif ...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 1 2011, 14:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(SPACUM @ Jul 1 2011, 16:58) *
1.Во первыых терминология. До БПФ массив называется сигнал или выборка и алгоритм получения выборки не имеет отношения к заданным вопросам. После БПФ массив называется спектр, он комплексный Re и Im. После взятия корня из суммы квадратов получается массив амплитуд гармоник Фурье.
2.Термин "громкость" уже обсуждался и оказалось громкость = максимальная амплитуда.

Ага, спасибо, пока ещё "плаваю" в терминологии.

Цитата(SPACUM @ Jul 1 2011, 16:58) *
5.В измерении шума всегда используют критерий мощности. Возвести каждое значение сигнала в квадрат просуммировать разделить на количество и извлечь корень. Или возвести каждое значение амплитуды спектра в квадрат просуммировать и извлечь корень. (Делить не надо). Эти значения должны быть равны.

То есть, "должны"?
Они обязательно будут равны или же "если равны, то ..."?
Допустим, я получил величину "корень из суммы квадратов амплитуд спектра". У неё какая размерность?
Если её поделить на максимальную амплитуду, то это можно будет использовать как некоторый порог шума?

Цитата(DRUID3 @ Jul 1 2011, 17:33) *
...бред какой-то )))... Вам нужно удостовериться, что главный пик это голос а потому имеет "ощутимую" 2-ую и третью гармоники...

В комментах предыдущих программист так написал:
Код
// If the volume is one of the 2-harmonics with maximum volume less than the threshold SIGNAL_LEVEL, it makes no sense to use to search for
// other harmonics of the fundamental frequency, because they are very weak, and perhaps are simply noise. Return as the fundamental frequency
// frequency with the maximum volume
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jul 1 2011, 15:19
Сообщение #7


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(QuickNick @ Jul 1 2011, 17:56) *
В комментах предыдущих программист так написал:
Код
// If the volume is one of the 2-harmonics with maximum volume less than the threshold SIGNAL_LEVEL, it makes no sense to use to search for
// other harmonics of the fundamental frequency, because they are very weak, and perhaps are simply noise. Return as the fundamental frequency
// frequency with the maximum volume

...что переводится так - "если высшие гармоники ниже шумового порога нет смысла их искать, они "потоплены" в шуме"... Вы же сделали совсем странные выводы...

Кстати, SPACUM, дает Вам не очень грамотные советы(относительно шума) - он, видимо, программист от матлаба. Хотя может Вам тоже прога для матлаба нужна?


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 2 2011, 09:10
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(DRUID3 @ Jul 1 2011, 18:19) *
...что переводится так - "если высшие гармоники ниже шумового порога нет смысла их искать, они "потоплены" в шуме"... Вы же сделали совсем странные выводы.

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

Цитата(DRUID3 @ Jul 1 2011, 18:19) *
Кстати, SPACUM, дает Вам не очень грамотные советы(относительно шума) - он, видимо, программист от матлаба. Хотя может Вам тоже прога для матлаба нужна?

На Яве пишу.
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jul 3 2011, 00:09
Сообщение #9


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(QuickNick @ Jul 2 2011, 12:10) *
Таков алгоритм предыдущего программиста.

Педыдущего если иди сверху? А если серьезнее - не знаю какой там алгоритм, но ваши пункты мало соответствуют тем
строчкам на английском языке. что Вы привели. Потому - не знаю что и думать.

Цитата(QuickNick @ Jul 2 2011, 12:10) *
Повторюсь, всё, что я изменил в нём - это сделал настраиваемость оконных функций и фильтров (в предыдущей версии они
были "железно" прописаны).

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

Цитата(QuickNick @ Jul 2 2011, 12:10) *
На Яве пишу.

Гы... Прикол. Не забудьте еще частоту дискретизации 8000 выставить, а то наваяете... А какая "ява"? "Наша" или
"андроидная"?

Я бы делал так:

1) скользящее среднее проверяет наличие звуковой активности(т.к. блок>>фонемы).
2) автокоррелятор проверяет шумовой ли сигнал (единственный пик на 0-е) или колебательный(периодическая
автокорреляционная функция). Ну и находим основную частоту - 1/период_автокорреляционной_функции .
))))))) . Но этот путь жрет много ресурсов. Можно автокорреляцию аппроксимировать конечно. Шагать непосэмплово. Но
это трудный путь )))...

...тогда так:
1) скользящее среднее проверяет наличие звуковой активности(т.к. блок>>фонемы).
2) если есть активность, то RealFFT начиная с момента активности.
3) Получение быстрой оценки физического спектра - Р.Лайонс ст.475
4) Получить массив указателей на массив значений физического спектра. Ну не знаю как там в Java придумаете. Нужно
чтобы и номера отсчетов первоначального спектра остались и отсортированный их массив был. Ну а далее техническое
творчество. Если наибольший спектральный компонент не на нулевой частоте и содержит ощутимую часть(вот этот бы порог
сделать изменяемым-подстраиваемым) от общей энергии (сумма всех компонент физического спектра) то осталось проверить
наличие 2-ой и третьей гармоники. Если такой компоненты нет - методом исключения - сигнал шумоподобный. Экономим кучу нервов и MIPS'ов wink.gif .

2SPACUM:
Вы уж не серчайте, что я так о Вас - мол, программист от матлаба. Просто бывают и такие. Кому математический формализм важнее физической реализации. И 100% и такие нужны... Но... Как видите в предложенной мной схеме не нужно мерять шум возводя отсчеты в квадрат - экономим сотни MIPS'ов но не противоречим здравому смыслу.


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
SPACUM
сообщение Jul 3 2011, 16:59
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531



Цитата(DRUID3 @ Jul 3 2011, 04:09) *
Вы уж не серчайте, что я так о Вас - мол, программист от матлаба.

А чего серчать? Каждый может ошибаться. Матлабом не пользуюсь совсем. Все алгоритмы о которых пишу проверил только на микроконтроллерах и на реальных сигналах. Люблю 32-битную целочисленную математику. Всякая отсебятина требует тщательной проверки на синтетических и реальных сигналах. В чудеса я верю, но это должны быть надежно проверенные чудеса.
Описанный мной метод показался мне надежным и устойчивым, только 50Гц и 100Гц без сигнала обязательно влезут. А качество сигнала легко вычислить зная суммарную энергию найденных трех гармоник и суммарную энергию всего сигнала.


--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jul 3 2011, 21:28
Сообщение #11


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(SPACUM @ Jul 3 2011, 19:59) *
Матлабом не пользуюсь совсем.

Еще раз прошу прощения, что так Вас обозвал wink.gif ...

Цитата(SPACUM @ Jul 3 2011, 19:59) *
Каждый может ошибаться.

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

Цитата(SPACUM @ Jul 3 2011, 19:59) *
Люблю 32-битную целочисленную математику.

Тем более, думаю, Вы оцените, что своими, возможно иногда и бестактными советами я таки да и облегчаю жизнь разработчикам wink.gif ...

Цитата(SPACUM @ Jul 3 2011, 19:59) *
Всякая отсебятина требует тщательной проверки на синтетических и реальных сигналах. В чудеса я верю, но это должны быть надежно проверенные чудеса.

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

Цитата(SPACUM @ Jul 3 2011, 19:59) *
... только 50Гц и 100Гц без сигнала обязательно влезут...

Так выкинуть их из FFT... обнулить...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 4 2011, 06:19
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(DRUID3 @ Jul 3 2011, 03:09) *
Педыдущего если иди сверху? А если серьезнее - не знаю какой там алгоритм, но ваши пункты мало соответствуют тем
строчкам на английском языке. что Вы привели. Потому - не знаю что и думать.

До меня программист писал - как он объяснил, таким методом он в жизни струны настраивает. Может, я его неправильно понял, не знаю - просто музыкального слуха у меня нет, гитару настроить не смогу никогда.
Я потестил - впечатление, что действительно не нужен пункт с проверкой вершин относительно "сигнального уровня".

Цитата(DRUID3 @ Jul 3 2011, 03:09) *
...а я бы оконные функции выбросил. Размен улучшения разрешения по частоте на уменьшение разрешения по времени(по-
сути потерю "энергетики") не оправдывает себя для поиска основного тона. И метрология здесь ни к чему, мало того с
окнами она ложная.

Тестеры разберутся, что оптимальнее. Нужно будет - поставим прямоугольное окно.

Цитата(DRUID3 @ Jul 3 2011, 03:09) *
Гы... Прикол. Не забудьте еще частоту дискретизации 8000 выставить, а то наваяете... А какая "ява"? "Наша" или
"андроидная"?

Андроидная Ява, да.
С 8000 уже столкнулся - решил проверить, что будет, если увеличить частоту дискретизации вдвое.
А действительно, почему так?
Что произошло?

Цитата(DRUID3 @ Jul 3 2011, 03:09) *
Я бы делал так:

1) скользящее среднее проверяет наличие звуковой активности(т.к. блок>>фонемы).
2) автокоррелятор проверяет шумовой ли сигнал (единственный пик на 0-е) или колебательный(периодическая
автокорреляционная функция). Ну и находим основную частоту - 1/период_автокорреляционной_функции .
))))))) . Но этот путь жрет много ресурсов. Можно автокорреляцию аппроксимировать конечно. Шагать непосэмплово. Но
это трудный путь )))...

...тогда так:
1) скользящее среднее проверяет наличие звуковой активности(т.к. блок>>фонемы).
2) если есть активность, то RealFFT начиная с момента активности.
3) Получение быстрой оценки физического спектра - Р.Лайонс ст.475
4) Получить массив указателей на массив значений физического спектра. Ну не знаю как там в Java придумаете. Нужно
чтобы и номера отсчетов первоначального спектра остались и отсортированный их массив был. Ну а далее техническое
творчество. Если наибольший спектральный компонент не на нулевой частоте и содержит ощутимую часть(вот этот бы порог
сделать изменяемым-подстраиваемым) от общей энергии (сумма всех компонент физического спектра) то осталось проверить
наличие 2-ой и третьей гармоники. Если такой компоненты нет - методом исключения - сигнал шумоподобный. Экономим кучу нервов и MIPS'ов wink.gif .

Хух sm.gif Столько терминов, что у ученика перегрузка мозга произошла sm.gif

Спасибо!
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jul 4 2011, 07:03
Сообщение #13


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(QuickNick @ Jul 4 2011, 09:19) *
До меня программист писал ...

У Вас английский "внутрикорпоратив"?

Цитата(QuickNick @ Jul 4 2011, 09:19) *
Тестеры разберутся, что оптимальнее. Нужно будет - поставим прямоугольное окно.

...им не пофиг?

Цитата(QuickNick @ Jul 4 2011, 09:19) *
Андроидная Ява, да.

Ха... а что там есть из звукового API?

Цитата(QuickNick @ Jul 4 2011, 09:19) *
С 8000 уже столкнулся - решил проверить, что будет, если увеличить частоту дискретизации вдвое.
А действительно, почему так?
Что произошло?

Х.з. rolleyes.gif ... а если серьезнее - я вообще о том, что нужно выставлять 8000 во всех приложениях связанных с голосом иначе оверхед - ну там 44100 например. А не заработало у Вас скорее всего из-за того, что звуковушка там 16000 не поддерживает.

Цитата(QuickNick @ Jul 4 2011, 09:19) *
Хух sm.gif Столько терминов, что у ученика перегрузка мозга произошла sm.gif

Скользящее среднее тотже Лайонс ст.398. RealFFT кажется есть в API "андроида"... "квиксорт" тоже должен быть. А о автокорреляторе просто пока забудьте.

Цитата(QuickNick @ Jul 4 2011, 09:19) *
Спасибо!

blink.gif Стоп, а деньги где?

P.S.: ...простой проект по захвату звука в "андроиде"... Вдруг кому пригодиЦЦо...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 4 2011, 07:42
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(DRUID3 @ Jul 4 2011, 10:03) *
У Вас английский "внутрикорпоратив"?
...им не пофиг?
Ха... а что там есть из звукового API?
Х.з. rolleyes.gif ... а если серьезнее - я вообще о том, что нужно выставлять 8000 во всех приложениях связанных с голосом иначе оверхед - ну там 44100 например. А не заработало у Вас скорее всего из-за того, что звуковушка там 16000 не поддерживает.

1. Комменты он писал на английском - не знаю зачем.
2. Они скажут, при каких параметрах тюнер лучше работает - их уже намертво пропишем. Чтобы легко всё настраивалось, я в виде фабричных методов всё организовал.
3. Не в курсе.
4. Не заработало из-за приведения типов - я уже разобрался.
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 4 2011, 12:30
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006



Цитата(DRUID3 @ Jul 3 2011, 03:09) *
Гы... Прикол. Не забудьте еще частоту дискретизации 8000 выставить, а то наваяете... А какая "ява"? "Наша" или
"андроидная"?


А на ПК какой библиотекой для записи звуков нужно пользоваться?
Хотелось бы приложение сделать, в котором рисовались бы промежуточные данные обработки сигнала. То есть, к компу подключается микрофон, и в реальном времени рисуются графики, спектры и т.д.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 22:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01519 секунд с 7
ELECTRONIX ©2004-2016