сбит с толку спектра БПФ фазы!

9

Очень простой эксперимент MATLAB:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

И вот вывод: введите описание изображения здесь

Теперь внесены небольшие изменения в приведенный выше фрагмент кода; сокращение длительности всего на 1 образец следующим образом:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

И фазовый спектр полностью сходит с ума:

введите описание изображения здесь

Вопросов:

  1. На первом графике я надеялся увидеть нулевую фазу в ячейке 700, которая соответствует положительной частоте 200 в этом примере. Кажется, это не так. Во-вторых, я не понимаю линейных частей графика на графике 1. Я ценю фазовые компоненты, которые потенциально могут существовать из-за так называемого числового шума, но тогда как этот шум может быть таким «линейным» по фазе?

  2. Во втором графике, почему удаление только одного образца могло бы иметь такое сильное влияние на фазовый график?

  3. Я делаю что-то в корне не так?

user4673
источник

Ответы:

18

Вы не делаете ничего плохого, но вы также не задумываетесь о том, что вам следует ожидать, поэтому вы удивлены результатом. Для вопроса 1 ваша гипотеза близка, но у вас действительно есть вещи назад; это второй цифровой шум, а не ваш первый.

Фотографии могут помочь. Вот графики величины и фазы для первого испытания:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

введите описание изображения здесь

введите описание изображения здесь

И второй:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

введите описание изображения здесь

введите описание изображения здесь

К/10000К999

К/10010К1000200/1000К/1001

В общем, я думаю, что графики фазового угла - действительно плохая идея для передачи информации, именно по этой причине; Во-первых, вы не можете определить, смотрите ли вы на фазу низкоамплитудного мусора или фактического сигнала, и, во-вторых, это не трансляционно-инвариантно, и легко получить совершенно непонятные графики для простых входных данных. Гораздо лучше, если вы все еще ищете что-то, что передает информацию о фазе, это график, который одновременно отображает информацию о фазе и амплитуде одним и тем же визуальным способом, например график, где фаза кодируется как оттенок, а величина кодируется как яркость.

ДОБАВЛЕНИЕ: Вот пара фотографий от Mathematica, которые иллюстрируют принцип, который я изложил в предыдущем абзаце:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

11×11500×500я-1-якарты в фиолетовый. Это то, что я имею в виду, когда говорю, что фазовые спектры не являются инвариантами сдвига и, следовательно, не поддаются человеческому визуальному пониманию. Например, при циклическом сдвиге 200 точек данных совершенно невозможно сказать, что происходит в фазе, поскольку это выглядит просто как статическое, но входной сигнал не сложнее, чем в других случаях ввода.

DumpsterDoofus
источник
0

Если вы хотите изменить частоту сигнала или длину БПФ так, чтобы сигнал варьировался между точно периодическим и не совсем периодическим в апертуре БПФ, и не хотите видеть фазу элемента максимальной амплитуды для этого изменения сигнала, начальную фазу сигнала можно отнести к центру, если апертура FFT вместо начала (для сгенерированного sin (t) положите t = 0 в центр массива FFT).

hotpaw2
источник
-1

Сайт Gaussian Waves детализирует часть о фазе и ее случайном поведении: просто вопрос с плавающей точкой, как сказал DumpsterDoofus

Гим
источник