2013-11-13 4 views
0

Привет, парень Я работаю над простыми сигналами, и я хочу рассчитать преобразование Фурье сигнала, получить величину и фазы, а затем восстановить исходный сигнал из что.Фурье-преобразование: получение mag + фазы, затем использование тех, для построения исходного сигнала

Я основываю свой код на this нить.

Код:

>> n=0:99; 
>> N=length(n); 
>> x = sin((2*pi/N).*n).*cos((pi/N).*n); 
>> F = fft(x); 
>> mag = sqrt(real(F).^2 + imag(F).^2); 
>> phase = atan2(imag(F),real(F)); 
>> re = mag .* cos(phase); 
>> im = mag .* sin(phase); 
>> F_i = re + 1i*im; 
>> x_i = ifft(F_i); 
>> figure;stem(x);figure;stem(x_i); 

Я полностью получить различные графики.

EDIT: Я на самом деле делаю это, чтобы проверить, что произойдет с сигналом, если произойдет смена фазы. Поэтому с этим мне понадобится фазовый угол для создания сигнала снова.

Я по-прежнему новичок как в Фурье + Матлабе, поэтому прошу прощения, если я делаю какую-то случайную глупую ошибку. Буду признателен, если вы, ребята, можете указать мне в правильном направлении. Спасибо.

+0

Мнимой частью 'F_i' является в основном ошибка округления, если вы используете' F_i = re', цифра воспроизводится правильно. Я не знаю достаточно о преобразованиях Фурье, чтобы сказать вам, почему это настолько подвержено числовой нестабильности. – David

+0

Это правда. Я на самом деле делаю это для эксперимента, где я меняю фазовый угол и реконструирую сигнал и вижу, что такое изменение. Есть ли другой способ, которым я могу это сделать? – kir

ответ

2

Проблема возникает из-за ошибок округления в phase, поэтому не используйте их при калибровке синусоидального и горизонтального углов. Вместо этого следует использовать тригонометрические тождества cos(atan(A))=(1+A^2)^(-1/2) и sin(atan(A))=A*(1+A^2)^(-1/2), и так

re = mag .* real(F)./sqrt(real(F).^2+imag(F).^2); 
im = mag .* imag(F)./sqrt(real(F).^2+imag(F).^2); 

EDIT: Я думаю, что если вы хотите изменить фазовый угол S, это будет делать трюк:

re = mag .* (real(F)*cos(S)-imag(F)*sin(S))./sqrt(real(F).^2+imag(F).^2); 
im = mag .* (real(F)*sin(S)+imag(F)*cos(S))./sqrt(real(F).^2+imag(F).^2); 

edit2: Вы по-прежнему иногда получаете плохие результаты с ненулевой мнимой частью (например, если S=pi), и вам нужно будет построить либо stem(real(x_i)), либо stem(1:length(x_i),x_i), как предложил Луис.

+0

Спасибо, что это правильно воспроизводит сигнал. Если я хочу изменить im, чтобы добавить добавление константы «10», мне нужно выполнить какие-либо вычисления или достаточно «im = im + 10»? – kir

+0

Да, если вы хотите изменить 'im', просто сделайте это. Я отредактировал свой ответ, чтобы включить то, что я считаю формулами для 're' и' im', с фазовым сдвигом 'S' radians. – David

+0

@David Предположим, хочу ли я изменить всю фазовую матрицу на что-то, скажем, на фазу, а затем захочет применить ifft() с использованием mag и phase-new, то как мне следует продолжить? – Jerky

2

В БПФ нет такой числовой неустойчивости. Проблема в том, что ошибки округления дают очень маленькую мнимую часть в восстановленном сигнале x_i. Это нормально. Действительная часть x_i правильно воспроизводит x, тогда как мнимая часть x_i очень маленькая. Вы можете проверить с stem(real(x_i)) и stem(imag(x_i))

Теперь stem(x_i) со сложными x_i участков мнимой части по сравнению с действительной частью. На руке, stem(1:length(x_i),x_i) (или, конечно, stem(real(x_i))), находится в действительной части x_i. Обратите внимание, что это согласуется с поведением plot «s (смотрите также ответ на this question)

Так что сюжет реальных мнимые части x_i отдельно stem. Вы увидите, что реальная часть воспроизводит x, как и ожидалось, а мнимая часть пренебрежимо мала (порядка eps).

+0

Да, это правда. Интересно, почему мое решение устраняет проблему? – David

+0

@David Почему-то это не вызывает ошибок округления, следовательно, нет никакой мнимой части в 'stem' и никаких проблем при построении графика. Странная часть - вот почему 'stem' делает это со сложным аргументом. Было бы разумнее, если бы он проигнорировал мнимую часть, так как «plot (x, y)» делает –

+0

@David. Фактически, 'stem (x, y)' _does_ ведет себя как 'plot (x, y)': он игнорирует мнимая часть 'y'. –