Просмотр исходного кода

Fix SDRplay cleanup and reuse FFT plan

master
Jan Svabenik 4 дней назад
Родитель
Сommit
514d5abf28
4 измененных файлов: 39 добавлений и 10 удалений
  1. +3
    -1
      cmd/sdrd/main.go
  2. +11
    -7
      internal/fft/fft.go
  3. +24
    -0
      internal/fft/plan.go
  4. +1
    -2
      internal/sdrplay/sdrplay.go

+ 3
- 1
cmd/sdrd/main.go Просмотреть файл

@@ -449,6 +449,7 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *
dcBlocker := dsp.NewDCBlocker(0.995)
dcEnabled := cfg.DCBlock
iqEnabled := cfg.IQBalance
plan := fftutil.NewCmplxPlan(cfg.FFTSize)
useGPU := cfg.UseGPUFFT
var gpuEngine *gpufft.Engine
if useGPU && gpuState != nil && gpuState.Available {
@@ -480,6 +481,7 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *
}
if upd.window != nil {
window = upd.window
plan = fftutil.NewCmplxPlan(cfg.FFTSize)
}
dcEnabled = upd.dcBlock
iqEnabled = upd.iqBalance
@@ -546,7 +548,7 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *
spectrum = fftutil.SpectrumFromFFT(out)
}
} else {
spectrum = fftutil.Spectrum(iq, window)
spectrum = fftutil.SpectrumWithPlan(iq, window, plan)
}
now := time.Now()
finished, signals := det.Process(now, spectrum, cfg.CenterHz)


+ 11
- 7
internal/fft/fft.go Просмотреть файл

@@ -1,10 +1,6 @@
package fftutil

import (
"math"

"gonum.org/v1/gonum/dsp/fourier"
)
import "math"

func Hann(n int) []float64 {
w := make([]float64, n)
@@ -21,6 +17,11 @@ func Hann(n int) []float64 {
}

func Spectrum(iq []complex64, window []float64) []float64 {
plan := NewCmplxPlan(len(iq))
return SpectrumWithPlan(iq, window, plan)
}

func SpectrumWithPlan(iq []complex64, window []float64, plan *CmplxPlan) []float64 {
n := len(iq)
if n == 0 {
return nil
@@ -34,9 +35,12 @@ func Spectrum(iq []complex64, window []float64) []float64 {
}
in[i] = complex(float64(real(v))*w, float64(imag(v))*w)
}
fft := fourier.NewCmplxFFT(n)
out := make([]complex128, n)
fft.Coefficients(out, in)
if plan != nil && plan.N() == n {
plan.FFT(out, in)
} else {
NewCmplxPlan(n).FFT(out, in)
}

power := make([]float64, n)
eps := 1e-12


+ 24
- 0
internal/fft/plan.go Просмотреть файл

@@ -0,0 +1,24 @@
package fftutil

import "gonum.org/v1/gonum/dsp/fourier"

type CmplxPlan struct {
fft *fourier.CmplxFFT
n int
}

func NewCmplxPlan(n int) *CmplxPlan {
if n <= 0 {
return &CmplxPlan{}
}
return &CmplxPlan{fft: fourier.NewCmplxFFT(n), n: n}
}

func (p *CmplxPlan) N() int { return p.n }

func (p *CmplxPlan) FFT(out, in []complex128) {
if p == nil || p.fft == nil {
return
}
p.fft.Coefficients(out, in)
}

+ 1
- 2
internal/sdrplay/sdrplay.go Просмотреть файл

@@ -128,6 +128,7 @@ func (s *Source) configure(sampleRate int, centerHz float64, gainDb float64, bwK
if err := cErr(C.sdrplay_api_LockDeviceApi()); err != nil {
return fmt.Errorf("sdrplay_api_LockDeviceApi: %w", err)
}
defer func() { _ = cErr(C.sdrplay_api_UnlockDeviceApi()) }()

var numDevs C.uint
var devices [8]C.sdrplay_api_DeviceT
@@ -139,10 +140,8 @@ func (s *Source) configure(sampleRate int, centerHz float64, gainDb float64, bwK
}
s.dev = devices[0]
if err := cErr(C.sdrplay_api_SelectDevice(&s.dev)); err != nil {
_ = cErr(C.sdrplay_api_UnlockDeviceApi())
return fmt.Errorf("sdrplay_api_SelectDevice: %w", err)
}
_ = cErr(C.sdrplay_api_UnlockDeviceApi())

var params *C.sdrplay_api_DeviceParamsT
if err := cErr(C.sdrplay_api_GetDeviceParams(s.dev.dev, &params)); err != nil {


Загрузка…
Отмена
Сохранить