2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3  След.
 
 Преобразование Фурье
Сообщение24.09.2018, 05:12 
Аватара пользователя
Здравствуйте.

Допустим есть сигнал, заданый в виде таблицы значений. Если я подвергну его преобразую Фурье, я получу значения амплитуды и фазы. То есть комплексные числа, модуль этого числа равен амплитуде сигнала, а поворот - фазе. Для каждой частоты получу своё комплексное число. Это получается своего рода разложение входящего сигнала по набору базисных функций. А полученые комплексные числа - это коэфиценты разложения.

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

Это работает, но ведь мы получаем значение частот, их амплитуды и фазы, можно ли пойти другим путём?
Нельзя ли представить весь сигнал как сумму синусов или косинусов или функций $ e^{2 \pi  i  w  t}$, но чтобы t была переменная непрерывная, то есть в виде аналитического выражения, формулы, в которую можно подставить любое значение времени?

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 06:16 
_20_ в сообщении #1340981 писал(а):
Нельзя ли представить весь сигнал как сумму синусов или косинусов или функций $ e^{2 \pi  i  w  t}$, но чтобы t была переменная непрерывная


Можно. Это непрерывное преобразование Фурье (соответствующие формулы легко найти в сети).

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 11:23 
Аватара пользователя
Непрерывное преобрахование Фурье требует на вход непрерывную функцию. А если есть только дискретная?

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 12:06 
_20_ в сообщении #1341016 писал(а):
Непрерывное преобрахование Фурье требует на вход непрерывную функцию. А если есть только дискретная?
Тогда надо воспользоваться дискретным преобразованием Фурье. :-)

Результат ДПФ - это практически готовые коэффициенты для формулы разложения исходного сигнала в сумму. Подставите их в выражение для ряда Фурье - получите ту самую функцию, которая вам нужна.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 12:12 
Тут видимо имеется в виду неравномерная дискретизация. В этом случае БПФ не пойдёт. Но решение есть - нужно напрямую аппроксимировать данные тригонометрическим рядом.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 12:24 
Andrey_Kireew в сообщении #1341034 писал(а):
Тут видимо имеется в виду неравномерная дискретизация. В этом случае БПФ не пойдёт.
Зачастую даже в этом случае технически "дешевле" привести все к равномерной сетке, заполнив недостающие данные нулями. Это быстрее, чем возиться с LS-спектрами и т.п. Хотя, конечно, тут надо бы спросить ТС, есть ли у него неравномерность и, если да, то какая.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 12:34 
Если просто пропуски, то да. Если же дискрет времени "плавает", и частоты дискретизации, как таковой, нет - то привести не получится.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 13:29 
Andrey_Kireew в сообщении #1341040 писал(а):
Если же дискрет времени "плавает", и частоты дискретизации, как таковой, нет - то привести не получится.
На практике такое встречается очень редко - просто из-за ограниченной точности фиксации моментов времени. При этом, как мне кажется, если бы ТС имел шансы столкнуться именно с этим случаем, то он не задавал бы подобные вопросы.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 13:59 
Ещё как встречаются. Например, больной диабетом контролирует сахар в крови. Вот такие моменты измерения 11-31, 17-00, 23-45, 23-49 ... Минимальный интервал 1 минута, максимальный - сутки, и всего 20 измерений. Тут пропусков будет в сотни раз больше действительно измеренных значений. В этом случае, если их просто "забить" нулями, не о каком анализе и речи быть не может, ведь эта операция искажает данные. Когда пропусков мало, с этими искажениями ещё можно смириться, а когда много - уже нет.

Этот пример ещё ладно, решаемо, можно больного дисциплинировать, чтобы "по часам" себя "мониторил". Но бывают данные, в которых интервал времени не является произвольным, а например, определяется моментом наступления события. Бывает адаптивная дискретизация и много чего ещё.

Хотя, это всё отступление от темы. Может ТС ни о чём таком даже и не думал.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 17:36 
Аватара пользователя
Спасибо за предложения, ситуация такая, что сигнал частоты дискретизации примерно 250 Гц.

Но это в реальной ситуации, для примера я беру сгенерированый сигнал $ S = 0.7 \sin(2 \pi 3 t) + \sin(2 \pi 6 t)$
Для преобразования Фурье я использую matlab.

Код:
step = 0.01; %in seconds
SignalLength = 1.5; %in seconds
t = (0:step:SignalLength-step);
S = 0.7*sin(2*pi*3*t) + sin(2*pi*6*t);
F = fft(S);                                                        % Это фурье образ, здесь всё в порядке. F - это коэфиценты разложения.
F2 = abs(F/size(S,2));
F1 = F2(1:size(S,2)/2+1);
F1(2:end-1) = 2*F1(2:end-1);
f = (0:1/size(S,2):0.5)/step;
% Это обратное преобразование, дискретное, оно рабртает.
for n = 1:size(t2,2)
    for k = 1:size(F,2)
        temp2(n) = temp2(n) + abs(F(k)) * exp(1i * angle(F(k))) * exp((2 * pi * 1i * (n - 1) * (k - 1))/(size(t2,2)));
    end
end


Дискретное преобразование:
$F(t) =1/n \sum_{w=1}^{n} F(w)  e^{2 \pi \i /n (w-1) (t-1)}$
Непрерывное преобразование Фурье:
$F(t) = 1/(2 \pi) \int F(w) e^{i w t} dw$

Каким образом подставить в непрерывное преобразование Фурье коэфицениы из дискретного преобразования?

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 17:42 
Я, кажется, немного вас запутал, написав корявую фразу. Нужно взять выражение для ряда Фурье и подставить полученные коэффициенты в него.

 
 
 
 Re: Преобразование Фурье
Сообщение24.09.2018, 18:50 
_20_ в сообщении #1340981 писал(а):
Нельзя ли представить весь сигнал как сумму синусов или косинусов или функций $ e^{2 \pi  i  w  t}$, но чтобы t была переменная непрерывная, то есть в виде аналитического выражения, формулы, в которую можно подставить любое значение времени?

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

 
 
 
 Re: Преобразование Фурье
Сообщение25.09.2018, 06:11 
Аватара пользователя
Pphantom
wrest
Ну вот я бы очень хотел, чтобы оно так легко и просто получилось, но у меня не получается.
Код:
step = 0.01; %in seconds
SignalLength = 1.5; %in seconds
t = (0:step:SignalLength-step);
S = 0.7*sin(2*pi*3*t) + sin(2*pi*6*t);
F = fft(S);                                                        % Это фурье образ, здесь всё в порядке. F - это коэфиценты разложения.
F2 = abs(F/size(S,2));
F1 = F2(1:size(S,2)/2+1);
F1(2:end-1) = 2*F1(2:end-1);
f = (0:1/size(S,2):0.5)/step;


t2 = t;
temp2 = zeros(1,size(t2,2));
for n = 1:size(t2,2)
    for k = 1:size(F,2)
        temp2(n) = temp2(n) + abs(F(k)) * exp(1i * angle(F(k))) * exp((2 * pi * 1i * (n - 1) * (k - 1))/(size(t2,2)));
        %temp3(n) = temp3(n) + abs(F(k)) * exp(1i * angle(F(k))) * exp((2 * pi * 1i * (n - 1) * (k - 1))/(size(t3,2)));
    end
end
temp2 = temp2 / size(temp2,2);
figure
plot(t(1:plotingArea), temp2(1:plotingArea))
title('Signal after transformation')
xlabel('t (milliseconds)')
ylabel('X(t)')



%Вот здесь я пытаюсь изменить вектор времени.
t3 = 0:0.005:1.5;
temp3 = zeros(1,size(t3,2));
for n = 1:size(t3,2)
    for k = 1:size(F,2)
        temp3(n) = temp3(n) + abs(F(k)) * exp(1i * angle(F(k))) * exp((2 * pi * 1i * (n - 1) * (k - 1))/(size(t3,2)));
    end
end
temp3 = temp3 / size(temp3,2);
figure
plot(t3(1:plotingArea), temp3(1:plotingArea))
title('Signal after transformation with new vector t')
xlabel('t (milliseconds)')
ylabel('X(t)')

% Вот здесь я дополнительно избегаю зеркального эффекта.
t3 = 0:0.005:1.5;
temp3 = zeros(1,size(t3,2));
for n = 1:size(t3,2)
    for k = 1:size(F1,2)
        temp3(n) = temp3(n) + abs(F1(k)) * exp(1i * angle(F1(k))) * exp((2 * pi * 1i * (n - 1) * (k - 1))/(size(t3,2)));
    end
end
temp3 = temp3 / size(temp3,2);
figure
plot(t3(1:plotingArea), temp3(1:plotingArea))
title('Signal after transformation  with new vector t and corrected Fourier coefficients')
xlabel('t (milliseconds)')
ylabel('X(t)')


[img]
https://ibb.co/hidaGp[/img]

 
 
 
 Re: Преобразование Фурье
Сообщение25.09.2018, 08:05 
_20_
ЧТО не получается? Вот у вас на картинке "Signal after transformation" - это то что вы хотите.

 
 
 
 Re: Преобразование Фурье
Сообщение25.09.2018, 10:49 
_20_
А... я кажись понял. Поясните, что именно вы делаете в "вот тут я избегаю зеркального эффекта"?
Вам надо б взять только половину коэфициентов (то есть синусы только до 50 герц а не до 100). И всё станет гладко.

 
 
 [ Сообщений: 31 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group