Por que as FFTs têm lixo na extremidade de alta frequência? Suponha que eu simule este circuito no LTSPICE:
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:
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?
Respostas:
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=0
o último eliminando a compressão da forma de onda. Aqui está o que acontece quando essa opção é adicionada, mas nenhum timestep é imposto: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
plotwinsize
pode 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 :μ
É 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
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.μ
fonte
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.
fonte
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.
fonte