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

Используя выходные данные 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);
  }
}

person Dan    schedule 25.03.2019    source источник


Ответы (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));
person SleuthEye    schedule 26.03.2019
comment
Даст ли это как положительный, так и отрицательный фазовый спектр? Или мне нужно «развернуть» фазу? - person Dan; 26.03.2019
comment
Согласно документации atan2: этот метод вычисляет фазу theta путем вычисления арктангенса y/x в диапазоне от -pi до pi. - person SleuthEye; 26.03.2019
comment
Чтобы избавиться от шума в фазовом спектре, я должен заранее вычислить амплитуду (sqrt(re * re * im * im)) и отбросить ее ниже определенного порога, или я должен сделать это непосредственно со значением фазы (Math .atan2(им, ре))? - person Dan; 02.04.2019
comment
Если вы пытаетесь изолировать участки с сильным когерентным сигналом, имеющим относительно медленно меняющуюся фазу, от более слабого шума со случайно колеблющейся фазой, то первым будет путь (т.е. пороговое значение на основе вычисленной амплитуды). - person SleuthEye; 03.04.2019
comment
Чтобы избавиться от проблем с плавающей запятой/двойным округлением. - person Dan; 03.04.2019
comment
Затем вы можете округлить до ближайших x градусов с чем-то вроде x*Math.round(Math.toDegrees(Math.atan2(im,re))/x) - person SleuthEye; 03.04.2019