Вычисление фазового спектра сигнала

#java #fft #dft

#java #БПФ #dft

Вопрос:

Используя выходные данные либо JTransform, либо JWave, как следует вычислять фазовый спектр?

Должен ли я просто написать аналогичный метод, но вместо этого я вычисляю фазу, используя: Math.atan2(im / re) * Math.PI * 180 ?

Я использовал следующее для вычисления спектра амплитуд:

 @Override
public void computeSpectrum()
{
    // The spectrum into which we store the data
    super.spectrum = new double[signal.getSampledAmplitudes().length >> 1];

  // Compute the magnitude spectrum of the signal
  double re = 0, im = 0;
  for (int bin = 0; bin < spectrum.length - 1;   bin) {
       re = super.frequencyDomain[2 * bin];
       im = super.frequencyDomain[2 * bin   1];
       super.spectrum[bin] = Math.sqrt(re * re   im * im);
  }
}
  

Ответ №1:

Действительно, вы можете вычислить фазовый спектр в радианах с помощью аналогичного цикла, который вы использовали для спектра амплитуд :

 double re = 0, im = 0;
for (int bin = 0; bin < spectrum.length - 1;   bin) {
   re = super.frequencyDomain[2 * bin];
   im = super.frequencyDomain[2 * bin   1];
   super.spectrum[bin] = Math.atan2(im, re);
  

}

Если вы предпочитаете результат в градусах, просто преобразуйте фазы с помощью toDegrees()

 ...
   super.spectrum[bin] = Math.toDegrees(Math.atan2(im, re));
  

Комментарии:

1. Даст ли это как положительный, так и отрицательный фазовый спектр? Или я должен «развернуть» фазу?

2. Согласно atan2 документации: «Этот метод вычисляет тэту фазы путем вычисления тангенса дуги y / x в диапазоне от -pi до pi «.

3. Чтобы избавиться от шума в фазовом спектре, должен ли я заранее вычислить амплитуду (sqrt(re * re * im * im)) и отбросить ее ниже определенного порога, или я должен сделать это непосредственно для значения фазы (Math.atan2(im, re))?

4. Если вы пытаетесь изолировать участки с сильным когерентным сигналом, имеющим относительно медленно изменяющуюся фазу, от более слабого шума со случайно изменяющейся фазой, то первое было бы правильным решением (т. Е. Установление порога на основе вычисленной амплитуды)

5. Это для того, чтобы избавиться от проблем с плавающей точкой / двойным округлением.