оптимизация функции FFT окна (весовая функция)
Цитата:
Сообщение от
UA3DJY
Небольшой выигрыш в количестве декодированных сигналов дает применение синусоидальной весовой функции смещенной на два отсчета во временной области (на два бина в частотной).
При трех проходах с порогами 2.4 1.0 1.0:
- для функции используемой разработчиками получаю 1152 декодирования из которых 7 ложных
- для синусоидальной функции смещенной на два отсчета получаю 1157 декодирований из которых 6 ложных,
итого прирост на 6 верных декодирований.
Изменения кода в исходнике symspec65.f90:
кусок кода:
if(first) then
! Compute the FFT window
pi=4.0*atan(1.0)
width=0.25*nsps
do i=1,NFFT
z=(i-NFFT/2)/width
w(i)=exp(-z*z)
enddo
first=.false.
endif
меняем на следующий код:
if(first) then
! Compute the FFT window
pi=4.0*atan(1.0)
do i=1,NFFT
w(i)=sin(pi*(i+2)/NFFT)
enddo
first=.false.
endif
Результат получен для линейного приемного тракта SDR, чуть позже протестирую с файлами SDR+АРУ.
Результаты тестов для файлов с SDR c включенной АРУ при трех проходах с порогами 2.4 1.0 1.0:
- для функции используемой разработчиками получаю 3318 декодирований из которых 5 ложных
- для синусоидальной функции получаю 3365 декодирований из которых 7 ложных
- для синусоидальной функции смещенной на два отсчета получаю 3367 декодирований из которых 6 ложных,
итого прирост на 48 верных декодирований, или 1.4%.
Готовлю запрос на усовершенствование WSJT-X на лист разработчиков.
оптимизация функции FFT окна (весовая функция)
запрос на усовершенствование WSJT-X на лист разработчиков сделан, переписку можно найти здесь: WSJT / Mailing Lists
формат отображения изменений в исходном коде
с этого момента переходим на принятый разработчиками упрощенный формат отображения изменений в исходном коде, например:
--- a/branches/wsjtx/lib/symspec65.f90
+++ b/branches/wsjtx/lib/symspec65.f90
if(first) then
! Compute the FFT window
pi=4.0*atan(1.0)
- width=0.25*nsps
do i=1,NFFT
- z=(i-NFFT/2)/width
- w(i)=exp(-z*z)
+ w(i)=sin(pi*(i+2)/NFFT)
enddo
first=.false.
endif
Здесь запись:
--- a/branches/wsjtx/lib/symspec65.f90
+++ b/branches/wsjtx/lib/symspec65.f90
означает что в исходнике symspec65.f90 удаляется(---) и добавляется(+++) код.
--- а/ означает что кусок исходного кода предыдущего релиза в новом релизе удаляется
+++ b/ означает что кусок кода добавляется в новый релиз.
Строка со знаком "-" в начале означает что она удалена в новом релизе:
- w(i)=exp(-z*z)
Строка со знаком "+" в начале означает что она добавлена в новом релизе:
+ w(i)=sin(pi*(i+2)/NFFT)
оптимизация еще одной весовой функции, исходник subtract65.f90
еще одна модификация и еще дополнительные декодирования уже поверх того что было ранее достигнуто
изменения:
--- a/branches/wsjtx/lib/subtract65.f90
+++ b/branches/wsjtx/lib/subtract65.f90
-window(j)=cos(pi*j/NFILT)**2
+window(j)=cos(pi*j/NFILT)
результаты тестирования (прирост в % поверх ранее сделанных модификаций):
файлы с SDR c выключенной АРУ
всего 1163 JT65 декодирования из них 9 ложных
прирост количества правильных декодирований на 0.26 процента
файлы с SDR c включенной АРУ
всего 3403 JT65 декодирования из них 5 ложных
прирост количества правильных декодирований на 1 процент
Напоследок изюминка: звуковой файл на котором из 9 сигналов ранее декодировалось только 6 с последней модификацией дает 7 декодирований.
Готовлю запрос на применение этой модификации в WSJT-X на лист разработчиков.