Skip to content

Bugs Críticos e Melhorias no sdrpp_brown.py - Análise Completa #1

@leonam72

Description

@leonam72

Resumão

Após análise detalhada do código sdrpp_brown.py, identifiquei diversos bugs críticos, problemas de desempenho e oportunidades de melhoria. Este issue documenta todos os problemas encontrados com suas respectivas correções sugeridas.


🔴 Bugs Críticos

1. Variável FFT_SIZE Duplicada (Final do Arquivo)

Problema: A variável FFT_SIZE = 4096 está redefinida no final do arquivo, logo antes do if __name__ == "__main__", sobrescrevendo a definição global do início.

Localização: Aproximadamente na linha 1950+

Correção: Remover a linha duplicada no final do arquivo:

# REMOVER esta linha duplicada antes do if __name__
FFT_SIZE = 4096  # <-- REMOVER

if __name__ == "__main__":
    app = SDRppBrownApp()
    app.mainloop()

2. Método set_freq() Não Aplica Frequência ao Hardware

Problema: Na classe SDRDevice, o método set_freq() apenas atualiza a variável interna self.freq, mas não aplica ao hardware via self.sdr.center_freq.

Localização: Linha ~400

Código atual:

def set_freq(self, f):
    self.freq = int(f)

Correção:

def set_freq(self, f):
    self.freq = int(f)
    if self.sdr:
        try:
            self.sdr.center_freq = self.freq
        except:
            pass

3. Método _apply_center() Não Atualiza o Hardware

Problema: O método _apply_center() atualiza apenas self._center_hz mas nunca chama self.device.set_freq() para aplicar ao hardware.

Localização: Classe SDRppBrownApp

Correção: Adicionar linha:

def _apply_center(self):
    try:
        self._center_hz = int(self._center_v.get())
        if self.running:  # Adicionar esta linha
            self.device.set_freq(self._center_hz)  # Adicionar esta linha
        if self._spec: self._spec.redraw()
        if self._ruler: self._ruler.redraw()
    except ValueError:
        pass

🟡 Problemas de Desempenho

4. De-emphasis FM Usando Loop Python Puro (MUITO LENTO)

Problema: No método _demod() da classe VFO, o filtro de de-emphasis FM usa um loop Python puro que itera sobre cada amostra, causando desempenho horrível.

Localização: Linha ~180

Código atual:

if m == "FM":
    fm = np.angle(iq[:-1]*np.conj(iq[1:]))
    fm = np.append(fm, 0.0).astype(np.float32)
    out = np.zeros_like(fm); y = self._de_y
    a = 1/(1 + 75e-6*self._ar)
    for i, x in enumerate(fm):  # <-- LOOP PYTHON LENTO!
        y = y+a*(x-y); out[i]=y
    self._de_y = float(y)
    return out*0.5

Correção usando lfilter (60x+ mais rápido):

if m == "FM":
    fm = np.angle(iq[:-1]*np.conj(iq[1:]))
    fm = np.append(fm, 0.0).astype(np.float32)
    # De-emphasis usando filtro IIR
    tau = 75e-6
    b = [1.0]
    a_coef = [1.0, -(1.0 - 1.0/(1.0 + tau*self._ar))]
    out, zi = lfilter(b, a_coef, fm, zi=[[self._de_y]])
    self._de_y = float(zi[0,0])
    return (out*0.5).astype(np.float32)

5. Callback de Áudio com Dimensões Incorretas

Problema: Em _start_audio(), o callback assume que out é sempre 2D out[:n,0], mas sounddevice pode usar array 1D dependendo da configuração.

Localização: Método _start_audio()

Correção:

def cb(out, frames, _t, _s):
    try:
        chunk = self._aq.get_nowait()
        n = min(len(chunk), frames)
        if out.ndim == 2:
            out[:n, 0] = chunk[:n]  # Stereo/Multi-canal
        else:
            out[:n] = chunk[:n]      # Mono
        if n < frames:
            if out.ndim == 2:
                out[n:, :] = 0
            else:
                out[n:] = 0
    except queue.Empty:
        out.fill(0)

🔵 Funcionalidades Faltantes

6. Taxa de Amostragem Não Atualiza no Hardware

Problema: Quando o usuário altera a taxa de amostragem (SR) na UI, ela não é aplicada ao hardware RTL-SDR durante a operação.

Sugestão: Adicionar binding no combobox de SR para reconfigurar o hardware em tempo real (requer restart da stream).

7. Squelch Por VFO Não Visível na UI

Problema: Cada VFO tem um parâmetro squelch internamente, mas não há controle na UI para ajustá-lo.

Sugestão: Adicionar slider de squelch em cada painel de VFO:

tk.Label(bot, text="Sql:", ...).pack(side='left')
self._sql_v = tk.IntVar(value=int(v.squelch))
tk.Scale(bot, from_=-120, to=0, ..., variable=self._sql_v, 
         command=lambda _: self._apply_squelch()).pack(side='left')

✅ Melhorias Sugeridas

8. Adicionar Indicador de Nível de Sinal (S-Meter)

Sugestão: Adicionar bargraph mostrando potência do sinal em cada VFO.

9. Função de Gravação de Áudio

Sugestão: Botão para gravar áudio do VFO ativo em arquivo WAV.

10. Phase Drift no Modo Demo

Problema: Em _gen_demo(), a atualização da fase self._ph pode acumular erros usando t[-1].

Sugestão: Usar contador de amostras em vez de fase acumulada para evitar drift de longo prazo.


Prioridade de Correção

Alta (Crítico):

  1. Bug Bugs Críticos e Melhorias no sdrpp_brown.py - Análise Completa #1 - FFT_SIZE duplicado
  2. Bug #2 - set_freq() não aplica ao hardware
  3. Bug #3 - _apply_center() não atualiza hardware

Média (Performance):
4. Bug #4 - De-emphasis FM lento
5. Bug #5 - Callback de áudio

Baixa (Features):
6-10. Funcionalidades e melhorias


Observações Finais

O código está muito bem estruturado e o projeto é excelente! Estas correções vão melhorar significativamente a estabilidade e performance do aplicativo. Se precisar de ajuda para implementar qualquer uma dessas correções, posso fornecer patches completos.

Versão analisada: sdrpp_brown.py - commit a7913b4 (8 minutos atrás)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions