Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

61 行
1.5KB

  1. package stereo
  2. import (
  3. "math"
  4. "testing"
  5. "github.com/jan/fm-rds-tx/internal/audio"
  6. )
  7. func TestSSBAndVSBDelayMonoToMatchDiffPath(t *testing.T) {
  8. const sampleRate = 228000
  9. const wantDelay = (ssbHilbertTaps - 1) / 2
  10. for _, mode := range []Mode{ModeSSB, ModeVSB} {
  11. enc := NewStereoEncoder(sampleRate)
  12. enc.SetMode(mode, sampleRate)
  13. for i := 0; i < wantDelay; i++ {
  14. c := enc.Encode(audio.NewFrame(1, 1))
  15. if math.Abs(c.Mono) > 1e-12 {
  16. t.Fatalf("mode %s: mono leaked before delay filled at sample %d: got %.9f want 0", mode, i, c.Mono)
  17. }
  18. }
  19. c := enc.Encode(audio.NewFrame(1, 1))
  20. if math.Abs(c.Mono-1) > 1e-12 {
  21. t.Fatalf("mode %s: mono did not emerge after expected delay: got %.9f want 1", mode, c.Mono)
  22. }
  23. }
  24. }
  25. func TestDSBMonoRemainsUndelayed(t *testing.T) {
  26. enc := NewStereoEncoder(228000)
  27. enc.SetMode(ModeDSB, 228000)
  28. c := enc.Encode(audio.NewFrame(1, 1))
  29. if math.Abs(c.Mono-1) > 1e-12 {
  30. t.Fatalf("DSB mono should be immediate: got %.9f want 1", c.Mono)
  31. }
  32. }
  33. func TestResetClearsMonoDelayState(t *testing.T) {
  34. const sampleRate = 228000
  35. const wantDelay = (ssbHilbertTaps - 1) / 2
  36. enc := NewStereoEncoder(sampleRate)
  37. enc.SetMode(ModeSSB, sampleRate)
  38. for i := 0; i < wantDelay+4; i++ {
  39. _ = enc.Encode(audio.NewFrame(1, 1))
  40. }
  41. enc.Reset()
  42. for i := 0; i < wantDelay; i++ {
  43. c := enc.Encode(audio.NewFrame(1, 1))
  44. if math.Abs(c.Mono) > 1e-12 {
  45. t.Fatalf("reset did not clear mono delay at sample %d: got %.9f want 0", i, c.Mono)
  46. }
  47. }
  48. }