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.