purebasic.info

PureBasic forum
Текущее время: Пн дек 10, 2018 7:28 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Ресэмплинг
СообщениеДобавлено: Чт ноя 15, 2018 9:34 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 89
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Собственно имеем некий массив из оцифрованной функции (пусть будет затухающая синусоида).
Оцифровка производилась с частотой дискретизации F.
Надо данный массив пересчитать для частот дискретизации N>F и L<F.
Т.е. как бы сперва восстановить функцию, а потом оцифровать по-новой, но уже с другой частотой дискретизации.
Кто проделывал подобное, или хотя бы в каком направлении искать?

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Чт ноя 15, 2018 10:10 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
эээм... это сейчас про звук говорится? если да и это был скажем wav файл - то восстановить не знаю. сомнительно. а вот пережать в другое качество - в худшее - то можно с помощью bass.dll. хотя помница я что-то такое лепил велосипедное, когда с наскоку басс.длл подключить не смог. сам код уже не помню где и сохранял ли... но когда оно заработало - писал кипятком от восторга. правда я не был уверен что сделал все правильно, так как после конвертации звук был с каким-то металлическим призвуком.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Чт ноя 15, 2018 10:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
оказывается я об этом писал на буржуйском форуме... и причем на плохом английском.
https://www.purebasic.fr/english/viewto ... 70#p494170


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Пт ноя 16, 2018 12:02 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 336
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
для частот дискретизации N>F и L<F.

А можно подробнее про ф н л точнее N>F и L<F , ф это исходная дескритизация, а эн это опечатка типа H.
Дай точное определение значений частот исходной и на что перекодировать.

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

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Пт ноя 16, 2018 11:14 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
IncludeFile "ChartMod.pbi"
 
Procedure DecreasingSin(Array d.d(2), Array c.l(2))
  Protected i
  For i = 0 To ArraySize(d(),2)
    d(0,i) = Sin(Radian(i)) * (1 - i / ArraySize(d(),2))
    c(0,i) = #Red
  Next
EndProcedure
 
Procedure Resample(Array In.d(2), Array Ou.d(2), Array OuC.l(2), Rate.d)
  NewSize = ArraySize(In(),2) * Rate
  Dim Ou(ArraySize(In(),1), NewSize)
  Dim OuC(ArraySize(In(),1), NewSize)
  For i = 0 To NewSize
    iNearDown.i  = Round(i / Rate, #PB_Round_Down)
    iNearUp.i    = Round(i / Rate, #PB_Round_Up)
    dNearDown.d  = i / Rate - iNearDown
    dNearUp.d    = 1.0 - dNearDown
    Ou(0,i) = In(0,iNearDown) * dNearUp + In(0,iNearUp) * dNearDown
    OuC(0,i) = #Blue
  Next
EndProcedure  
 
Dim d.d(0, 5000)
Dim c.l(0, 5000)
Dim r.d(0,0)
 
Win = OpenWindow(#PB_Any, 0, 0, 900, 600, "Test Windows", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 
DecreasingSin(d(), c())
 
CHART::OpenChild(Win, 0, 0, 300, 600, d(), c(), #True, CHART::#XIdxNum)
 
Resample(d(),r(), c(), 0.1)
 
CHART::OpenChild(Win, 300, 0, 300, 600, r(), c(), #True, CHART::#XIdxNum)
 
Resample(d(),r(), c(), 2.5)
 
CHART::OpenChild(Win, 600, 0, 300, 600, r(), c(), #True, CHART::#XIdxNum)
 
Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow


Код ChartMod.pbi брать тут: http://purebasic.info/phpBB3ex/viewtopic.php?f=10&t=4960


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Пт ноя 16, 2018 8:50 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 89
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SereZa писал(а):
причем на плохом английском
А можно здесь на хорошем русском? :wink:

balex1978 писал(а):
ф это исходная дескритизация, а эн это опечатка типа H
Канэшна дика ызвыняюсь, но это у Вас в слове "дискретизация" две опечатки.
Надо оцифровать функцию с частотой N и частотой L, что тут непонятного?
Вам не нравятся буквы N и L? Пусть будут M и P.

Друзья!
Какая нафиг разница для ресемплинга, звук это, или какая другая функция?
При чём тут декодеры?
Собственно речь вот об этом.
Просто может кто уже имеет опыт, или готовое решение?

Kuzmat писал(а):
Код ChartMod.pbi
А там всё нужно для моей задачи? :)
Уф, попробую разобраться.

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Пт ноя 16, 2018 10:44 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
так вродеж библиотеку какую-то предложили :) думаю там получше будет. в моем случае я уже и сам точно не знаю что я там хотел буржуям втолковать... что-то типа расчет значения между двумя тиками, причем с правильным смещением от центра между тиками в ту или иную сторону в зависимости от выходного значения частоты. афигеть как заумно сказал, что сам не понял :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Пт ноя 16, 2018 11:39 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 89
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SereZa писал(а):
так вродеж библиотеку какую-то предложили
Дык, это же - соседняя ветка. :)

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Сб ноя 17, 2018 7:22 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
так а чо она не подошла чтоль?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Сб ноя 17, 2018 10:50 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Gregory писал(а):
Kuzmat писал(а):
Код ChartMod.pbi
А там всё нужно для моей задачи? :)
Там просто модуль "график", для "посмотреть на результат", а сама процедура Resample приведена выше.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Сб ноя 17, 2018 6:52 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 336
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Gregory писал(а):
Канэшна дика ызвыняюсь, но это у Вас в слове "дискретизация" две опечатки.
эт я уроки грамматики пропустил вовремя :lol: , хорошо что не калиграфии :| .
Цитата:
Надо оцифровать функцию с частотой N и частотой L, что тут непонятного?
Вам не нравятся буквы N и L? Пусть будут M и P.
Да мне всЁ НРАВИТСЯ :)
Не превращайте форум сами знаете во что.
Цитата:
Какая нафиг разница для ресемплинга, звук это, или какая другая функция?
Э "друг" тута ты не прав. Если звук то для этого могут быть уже подходящие проги по звуку, а если у тебя битрейт 100 Гц или 100 МГЦ, то тут нужен другой израт 8) .

SereZa а что если частота высокая и при оцифровке даже на 96 кГц 20кГц звука идет треугольнаками, как этот макар выромнять, плайны(кривые) рисовать что-ли, незнаешь :?: или синус подгонять чтобы выровнять поплавнее изгибы.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
; English forum: http://purebasic.myforums.net/viewtopic.php?t=6511&highlight=
; Author: ricardo
; Date: 12 June 2003
 
Structure PointAPI
x.l
y.l
EndStructure
 
Global Dim P.PointAPI(3)
 
Procedure CreateBezier()
StartDrawing(WindowOutput(0))
Red = RGB(255,0,0)
Blue = RGB(0,0,255)
P(0)\x = 0
P(0)\y = 0
P(1)\x = 80
P(1)\y = 10
P(2)\x = 150
P(2)\y = 70
P(3)\x = 130
P(3)\y = 230
 
LineXY(P(0)\x+10,P(0)\y+10,P(1)\x+10,P(1)\y+10,Blue)
Box(P(0)\x+10,P(0)\y+10, 4, 4,Red)
Box(P(1)\x+10,P(1)\y+10, 4, 4,Red)
 
LineXY(P(2)\x+10,P(2)\y+10,P(3)\x+10,P(3)\y+10,Blue)
Box(P(2)\x+10,P(2)\y+10, 4, 4,Red)
Box(P(3)\x+10,P(3)\y+10, 4, 4,Red)
hDC = GetDC_(GadgetID(1))
PolyBezier_(hDC,@P(),4)
StopDrawing()
EndProcedure
 
 
If OpenWindow(0,100,150,450,300,"Create Beizer Curve",#PB_Window_SystemMenu)
;  CreateGadgetList(WindowID())
  ImageGadget(1,10,10,255,255,LoadImage(0,""))
  ButtonGadget(3,300,140,50,25,"Curve")
  Repeat
    EventID=WaitWindowEvent()
   
    Select EventID
   
      Case #PB_Event_Gadget
        Select EventGadget()
           
          Case 3
            CreateBezier()
 
        EndSelect
   
    EndSelect
   
  Until EventID=#PB_Event_CloseWindow
EndIf
 



SereZa писал(а):
так а чо она не подошла чтоль?
да он и сам не знает чего хочет, а мы должны угадать и подогнать под его настроение код :roll: .

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Сб ноя 17, 2018 10:29 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 89
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SereZa писал(а):
не подошла чтоль?
Не разбирался ышо. :D

Kuzmat писал(а):
сама процедура Resample приведена выше.
Ясно.

balex1978 писал(а):
для этого могут быть уже подходящие проги по звуку
Что значит "могут быть"?
Они ЕСТЬ!
И не одна.
И у меня в том числе.
Но какое отношение они имеют к коду который мне надо встроить в свою утилиту?
Разве что упросить авторов поделиться исходниками. :mrgreen:

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Вс ноя 18, 2018 12:24 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
balex1978 писал(а):
как этот макар выромнять, плайны(кривые) рисовать что-ли, незнаешь :?:

эм... я тоже "треугольники" получается получал в своем конвертировании. по поводу округления треугольников даже не представляю как :) по идее если брать по три точки - три тика, идущие подряд, в файле вава и вписывать их в окружность чтоль. геометрия у меня была 3 в школе :) а инструмент изгибающаяся линия для PB ваще есть? в Painte то есть. нарисовал линию, а потом мышкой изгибаешь её.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Вс ноя 18, 2018 12:55 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 336
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
Но какое отношение они имеют к коду который мне надо встроить в свою утилиту?

Ну если у тебя спросили о частоте и тебе всеодно, то наверное точно никакого отношения.
Если звук то молча крутить как это делать другие:
загрузил звук, установил дискретизацию нужную и сохранил, всё.

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

Ну мож по рекомендации с вики:
Цитата:
при передискретизации звукового сигнала с 44100 Гц до 48000 Гц этим методом необходимо увеличить частоту дискретизации в 160 раз до 7056000 Гц и затем уменьшить её в 147 раз до 48000 Гц. Таким образом, в данном примере вычисления приходится производить на частоте дискретизации более 7 МГц

Прикидываю твои стенания, 100 метров инфы "увеличить частоту дискретизации в 160 раз" :lol: получим 16 000 метров(16 терабайт). :shock: .
Даже 1 метр уже ощутимо, 160 дает,Хм. :roll:
И декодим, ну там мелочь, можно не считать.
Удачи, могу только посочувствовать :roll:
SereZa писал(а):
инструмент изгибающаяся линия для PB ваще есть? в Painte то есть. нарисовал линию, а потом мышкой изгибаешь её.
ну какой-то кривой я кинул на АПИ типа PolyBezier_(hDC,@P(),4), код выше в спойлере viewtopic.php?f=5&t=4978&sid=2f08f6ce8a5c57c967e10428caa1996f#p90739.
Во кстати это оно и на паинтбраш используется.
Там нужно две точки между которых проводится линия.
и по две координаты для искривлений.
вот список на АПИ:
AngleArc
Arc
ArcTo
GetArcDirection
LineDDA
LineDDAProc
LineTo
MoveToEx
PolyBezier
PolyBezierTo
PolyDraw
Polyline
PolylineTo
PolyPolyline
SetArcDirection


=======
ну как у этого изврата получить координаты не знаю, ну разве по пиксельно высоту искать пока не встретиш черный пиксель.

Есть проще, типа по синусу, я у брата спросил чего у меня синус кривой на графике, а он мне про вторую координату чегото говорит, я долго немог понять о чем это он и тут прямо вкидываю в код и БАЦ :o круг получился, круто, теперь этот круг нужно на 4 части порубить и делать 3 точки как ты говорил. Но нужно уже метематика пригласить, а то плайты Безье какойто своей жизнью живут.
Код ровного круга в строке 10 и "синусоиды" в остальном :lol: :
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
OpenWindow(0,100,150,700,600,"Create Beizer Curve",#PB_Window_SystemMenu) 
 
If StartDrawing(WindowOutput(0))
    FrontColor(RGB(10,10,10))
    LineXY(0,200,500,200)
    LineXY(90,10,90,400)
    LineXY(0,291,500,291)
    For x=0 To 360 Step 1
        Delay(10)
        Plot(200-Sin(Radian(x ) )*90, Cos(Radian(x ) )*90+200, RGB(200,10,10 ) ); это верно
        Plot(x+20 , Cos(Radian(x ) )*90+200, RGB(10,200,10 ) )
        Plot(x+200, Cos(Radian(x ) )*90+200, RGB(10,10,200 ) )
    Next
StopDrawing()
EndIf
 
  Repeat
    EventID=WaitWindowEvent()
  Until EventID=#PB_Event_CloseWindow
 


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ресэмплинг
СообщениеДобавлено: Вс ноя 18, 2018 1:03 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
Gregory, ну согласно моей теории - а я конвертил из более лучшего качество в меньшее - должно выглядеть примерно так... эм... хотя сам забыл. ща. пойду перечитаю тот пост и напишу :)

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

теперь нам надо получить некий... почему как я не напишу коэфициент - гугель все равно подкрасит красным? - так вот нам надо его получить, а это формула:
Код:
1
coefficient.f = soursefreq / needfreq 


то есть оригинальную частоту поделить на нужную.

судя по картинке этот коэфицент примерно 1.2. читая дальше свою писанину на том форуме - мне зачем-то понадобилось округление:
Код:
1
2
first = Round(coefficient, #PB_Round_Down)
second = Round(coefficient, #PB_Round_Up)



ага. дальше видно на кой оно нужно - это самое округление даст смещение для чтения значения "тика" в оригинальном файле.
Код:
1
2
3
4
5
6
7
mem1 = PeekA(*wavadress + first)
mem2 = PeekA(*wavadress + second)
If mem1 > mem2
  inequality = mem1 - mem2
Else
  inequality = mem2 - mem1
EndIf


в итоге это мы получили значение если бы коэфициент был равен ровно 1. теперь от него нужно довычислить 0.2 часть.
Код:
1
2
increase.f = (inequality / 100) * ((coefficient - first) * 100)
roundincrease = Round(increase, #PB_Round_Nearest)


дальше расчет и вписывание нового значения в новый файл
Код:
1
2
3
4
5
6
7
If mem1 > mem2
  roundincrease + mem2
Else
  roundincrease + mem1
EndIf
 
PokeA(*newwav, roundincrease)



и так крутить до конца кусочка памяти, где сидит оригинальный вав и писать в другой участок памяти - где будет сидеть конверченный результат. а чтобы вычислить размер памяти для резервирования этого конверченного образа файла:
Код:
1
newsizefile.f = sizeofwav / soursefreq * needfreq


ну или можно не в память писать, а сразу в файл - там резервировать место в памяти не надо. но это по моему медленней, чем писать в память.

в конце надо будет создать шапку вав файла и вписать туда как data наш конверченный результат. после запустить в винампе и послушать.

но это, кажется, только для случая если надо конвертануть из лучшего в худшее качество. из худшего в лучшее не получится. точнее я вобще не вижу смысла так делать, так как потерянное качество один фиг не восстановить :)

однако я потом от этой затеи отказался и вернулся обратно к bass.dll. во первых этот алгоритм я писал очень приблизительно представляя как это должно работать, то есть это может быть не верным решением :) во вторых - это только для PCM wav подойдет. bass.dll же более универсальная и помимо wav в моем редакторе юнитов еще можно конвертировать из ogg благодаря этой bass.dll. из минусов же использования bass.dll - проблема заключается в том, что в оригинальной, или точнее базовой bass.dll нет функций по конвертированию звука. эти вещи должны подключаться через bassenc.dll и bassmix.dll. то есть дополнительные библиотеки. но казалось бы - да без проблем! вшиваю в тело моего ехе файла и bass.dll и обе эти дополнительные библиотеки и запускаю их из памяти. то есть сам файл моей программы получается своеобразный портэйбл - все свое ношу с собой. предполагалось что юзверь скопировал из одной папки в другую - и в той другой папке все работает. но сраный bass.dll подложил свинюшку. будучи подключенной из памяти эта bass.dll конечно работает (а использую её еще для записи звука), но вот bassmix.dll и bassenc.dll - требуют для своей работы эту самую bass.dll и в упор не видят её, когда она подключена из памяти, то есть из ресурсов ехе файла. эти библиотеки требуют обязательного наличия файла bass.dll рядом с ехе файлом. ишак нюхал этих создателей bass.dll за такое неудобное решение. не могли чтоль все в одну кучу собрать или как-то предусмотреть чтоб дополнительные могли из памяти читать какие им надо функции... пришлось лепить велосипед. то есть после копирования ехе файла моего редактора в другую папку - при запуске происходит проверка: а есть ли bass.dll в этой папке? если нету - из своих ресурсов распаковывает и только потом запускается сам редактор. не удобно кароче. впрочем мне потом по такой схеме понадобилось потом кучу файлов тоже таким-же образом из главного ехе файла распаковывать. получилось приложение как приложение и как инсталлятор одновременно.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB