Qual é o lixo no final da minha FFT no LTSPICE?


8

Por que as FFTs têm lixo na extremidade de alta frequência? Suponha que eu simule este circuito no LTSPICE:

esquemático

simular este circuito - esquemático criado usando o CircuitLab

Onde os parâmetros de seno e simulação do LTSPICE estão:

SINE(0 1 1K 0 0 0 1000)
.tran 1 startup

Depois, peço à LTSPICE que me forneça uma FFT sem janela e 1.000.000 de pontos: FFT

Para que serve todo esse lixo no final? Eu esperaria apenas um pico em 1KHz, não um adicional em 3KHz, etc. Isso acontece com todas as FFTs? O que controla os picos que você recebe após o seu fundamental?


Você pode realmente identificar as outras frequências? Eles são todos múltiplos ímpares de 1 kHz? Nesse caso, algo está distorcendo seu seno "perfeito" para parecer mais "retângulo", e pode ser apenas a precisão numérica que o ltspice usa internamente.
Marcus Müller

1
Eu não olharia abaixo de -100dB, mas começaria com a 3ª harmônica, nenhuma janela parece ser um problema
Tony Stewart Sunnyskyguy EE75

1
Pode ter algo a ver com a compressão da forma de onda. Veja esta outra pergunta para obter mais detalhes e como verificar se é esse o caso. electronics.stackexchange.com/questions/338292/...
mkeith

Não consigo reproduzir esses dados, minha versão do LTspice deseja que mais de 1e6 pontos simulados obtenham uma FFT de 1e6 pontos, ou seja, um intervalo de tempo máximo de 1e-6.
loudnoises

Você precisa do pico quase para corresponder ao espectro de áudio da modulação BW?
Tony Stewart Sunnyskyguy EE75 4/04

Respostas:


4

A resposta de @ D.Brown já é muito boa, então vou adicionar apenas algumas coisas menores. O algoritmo do LTspice é personalizado e aceita um número de pontos sem potência de dois. Isso não significa que a resolução não seja importante. Ainda assim, 1kHz acima de 1s significa um número inteiro de períodos; portanto, não há necessidade de janelas ou suavização binomial para reduzir o ruído (configurações na janela FFT). O que é, no entanto, o que @mkeith mencionou e, por padrão, o LTspice usa uma compressão de forma de onda (300 pontos por tela, IIRC), o que significa que outros pontos são reduzidos e a resolução da forma de onda sofre. A solução para isso é um timestamp mais apertado ou .option plotwinsize=0o último eliminando a compressão da forma de onda. Aqui está o que acontece quando essa opção é adicionada, mas nenhum timestep é imposto:

padrão

Provavelmente é isso que você vê, mais ou menos, então qual é a opção? Você está simulando uma forma de onda de 1 kHz durante um período de 1s . O circuito, se é que pode ser chamado assim, é uma fonte e carga simples, e a fonte é harmônica, uma tarefa moderada para o solucionador de matrizes; portanto, o LTspice, como todos os motores SPICE, se achar que a derivada é suave, duplicará seu timestep para não diminuir a velocidade da simulação e continuará dobrando até atingir algum limite interno atingido; nesse ponto, ele sobrevoará a simulação. O resultado é uma forma de onda grossa, que nem plotwinsizepode melhorar muito.

A outra cura, o timestep imposto, agora é necessária para melhorar a resolução. Aqui está o resultado com um intervalo de tempo de 1 :μ

10u

É melhor, mas você está executando um FFT de 1 milhão de pontos, o que requer, talvez não surpreendentemente, 1 milhão de pontos de tempo, portanto o tempo máximo deve ser definido como 1 s. Além disso, a opção está configurada para um valor> 7 que, pelo manual, permite dupla precisão:μnumdgt

ultra

Ainda existe um nível de ruído um pouco instável, mas o nível agora é inferior a -250dB. Isso é próximo à precisão da máquina. Fazer o timestep 1/1048576 (2 ^ -20) não melhora os resultados (você pode verificar por si mesmo).

No final, depende de quanto barulho você deseja aceitar. O comentário de Tony Stewart é de sensibilidade prática, abaixo de 100 ~ 120dB significa menos de 1 ~ 10 V a 1V, o que é uma conquista e tanto.μ


Obrigado por colocar o trabalho para esta resposta. Como um aparte, ele destacou para mim que o LTspice funciona drasticamente de maneira diferente no macOS em comparação com o Windows. (Estou assumindo que esta é a versão Windows)
loudnoises

@loudnoises Sim, embora no Wine, não que isso importe. Eu já vi alguns pontos, aqui e ali, no Yahoo LTspice Group, mas como não sou usuário de Mac, não insisti neles. Pode ser que também seja uma questão de configurações, escondidas sob o capô diferente, mas, na verdade, não tenho certeza.
um cidadão preocupado

Excelente! Agora, olhando para o arquivo de ajuda do LTSPICE, eu deveria ter notado o seguinte: "LTspice usa um algoritmo FFT proprietário que permite um número arbitrário de pontos de dados, isto é, não se limita a uma potência de 2. Quando você espera fazer FFTs da sua simulação dados, você provavelmente desejará desativar a compactação da forma de onda, estipular uma etapa de tempo máximo e possivelmente até usar o formato de arquivo de forma de onda de precisão dupla para reduzir o nível de ruído numérico ".
precisa saber é o seguinte

@ Um cidadão preocupado: Quando você declarou: "Aqui está o resultado com um intervalo de tempo de 1μs", você quis dizer: "Aqui está o resultado com um intervalo de tempo de 10μs"?
watkipet

@loudnoises Estou usando a versão nativa do macOS. Mas vejo os mesmos resultados que @um cidadão preocupado.
watkipet

15

Existem várias partes nessa resposta. Baseei essa resposta nas características do algoritmo FFT. Não estou familiarizado com a implementação específica do LTSpice, mas o comportamento relatado é exatamente o que eu esperaria.

As implementações mais comuns da FFT operam com uma potência inteira de 2 pontos de dados. Portanto, a maioria das implementações reduziria seus 1.000.000 pontos de dados para 1.048.576 pontos de dados e executaria a FFT nisso. Observe que esse comprimento não é um número inteiro de ondas senoidais.

Existem métodos alternativos de transformação de Fourier que decompõem os dados de maneira diferente. Eles geralmente são chamados métodos de Transformada discreta de Fourier (DFT) e são mais lentos e consideravelmente mais complexos de implementar. Eu quase nunca os encontrei em aplicações práticas. A FFT é uma implementação específica da DFT que exige que o número de pontos de dados seja uma potência inteira de 2 (ou às vezes uma potência inteira de 4).

Portanto, suponho que o LTSpice esteja estendendo seus dados para 1.048.576 pontos de dados, os 48.576 valores de dados adicionados no final contendo uma constante.

Agora você pode ver o problema: seu buffer de 1.048.576 amostras possui 1.000 ondas senoidais, cada uma das 1.000 amostras, seguidas por 48.576 valores constantes. Isso não pode ser representado por uma soma de ondas senoidais de frequência de 1kHz. Em vez disso, os resultados da FFT mostram os valores adicionais de alta frequência necessários para reconstruir seu sinal.

Para determinar se esse é o problema, crie um buffer de 1.048.576 amostras contendo uma onda senoidal com período de 1.024 amostras. As altas frequências devem ser consideravelmente reduzidas em magnitude.

Agora, quanto ao efeito de aplicar uma janela:

O algoritmo FFT conceitualmente 'agrupa' os dados, de modo que o último ponto dos dados de entrada é seguido pelo primeiro ponto dos dados de entrada. Ou seja, a FFT é calculada como se os dados fossem infinitos, repetidos circularmente, como um vetor com a sequência: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...

Esse agrupamento pode resultar em uma transição de etapa entre o último ponto no buffer de dados e o primeiro ponto. Essa transição de etapa gera resultados de FFT com contribuições grandes (falsas) de altas frequências. O objetivo de uma janela é eliminar esse problema. A função da janela chega a zero nas duas extremidades; portanto, no seu caso, w [0] e w [999999] seriam zero. Quando os dados são multiplicados pela janela, os valores se tornam zero no início e no final, portanto, não há transição de etapa no agrupamento.

A função da janela que você aplica altera o conteúdo da frequência do buffer, você escolhe uma função que apresenta uma troca aceitável. Um gaussiano é um bom ponto de partida. Para qualquer aplicação prática em que você não possa controlar com precisão o conteúdo de frequência dos dados, será necessário aplicar uma função de janela para eliminar a transição implícita de etapas devido ao comprimento dos dados.

Problemas residuais:

Existe outra fonte potencial de ruído espectral de alta frequência na FFT. O efeito aumenta com o comprimento da FFT e pode ser algo que você pode ver em alguns casos em 1.000.000 pontos de dados.

O loop interno do algoritmo FFT usa os pontos em torno de um círculo no plano complexo: e ^ (i * theta), onde o algoritmo itera 'theta' de 0 a 2 * pi em etapas sucessivamente mais finas, até o número de pontos no FFT. Ou seja, se você calcular uma FFT em 1.048.576 amostras, em uma das iterações do loop externo, o loop interno calculará e ^ (i * theta), em que theta = 2 * pi * n / N, em que N é 1.048.576 , iterando n de 0 a 1.048.575. Isso é feito pelo método óbvio de multiplicar sucessivamente por e ^ (i * 2 * pi / N).

Você pode ver o problema: à medida que N se torna grande, e ^ (i * 2 * pi / N) fica muito próximo de 1 e é multiplicado por N vezes. Com ponto flutuante de precisão dupla, os erros são pequenos, mas acho que você pode ver o nível de ruído resultante se olhar com cuidado. Com ponto flutuante de precisão única, em 1.000.000 pontos de dados, o próprio cálculo da FFT produz um ruído significativo.

Existem técnicas alternativas para calcular e ^ (i * theta) que eliminam esse problema, mas a implementação é mais complexa. Eu só tive que criar essa implementação uma vez.


Em relação à DFT versus FFT, o menu do botão direito do mouse no LTSPICE chama de "FFT", enquanto a caixa de diálogo de configuração chama de "DFFT". Agora, lendo o arquivo de ajuda, vejo o que um cidadão em questão mencionou sobre o LTSPICE aceitar um número de pontos que não é de dois em dois.
watkipet

0

Razao possivel: -

Quando você desenha uma onda transitória em um simulador, ela interpola entre cálculos reais, a fim de minimizar o trabalho árduo que está sendo feito e permitir que um resultado mais rápido seja exibido na tela.

A configuração padrão para timestep máximo no LTSpice pode ser de 100 us e, portanto, entre esses pontos, você tem resultados interpolados, ou seja, eles não são perfeitos e contribuem para distorções vistas como harmônicas na FFT.

Tente definir seu timestep máximo para ser muito menor do que é atualmente e veja o que acontece.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.