Я пытаюсь вычислить коэффициенты Фурье для формы волны с использованием MATLAB. Коэффициенты могут быть вычислены с использованием следующих формул:Как вычислить коэффициенты Фурье с MATLAB
Т выбран равным 1, что дает омега = 2pi.
Однако у меня возникают проблемы с выполнением интегралов. Функции представляют собой треугольную волну (которая может быть сгенерирована с использованием sawtooth(t,0.5)
, если я не ошибаюсь), а также прямоугольную волну.
Я попытался с помощью следующего кода (для треугольной волны):
function [ a0,am,bm ] = test(numTerms)
b_m = zeros(1,numTerms);
w=2*pi;
for i = 1:numTerms
f1 = @(t) sawtooth(t,0.5).*cos(i*w*t);
f2 = @(t) sawtooth(t,0.5).*sin(i*w*t);
am(i) = 2*quad(f1,0,1);
bm(i) = 2*quad(f2,0,1);
end
end
Однако это не получить в любом месте вблизи значений мне нужно. Коэффициенты b_m приведены для треугольной волны и должны быть 1/m^2 и -1/m^2, когда m нечетное чередование, начинающееся с положительного члена.
Основная проблема для меня в том, что я не совсем понимаю, как интегралы работают в MATLAB, и я не уверен, работает ли подход, который я выбрал.
Edit: Для clairify, это форма, которую я ищу, чтобы написать функцию о том, когда коэффициенты были определены:
Вот попытка с помощью FFT:
function [ a0,am,bm ] = test(numTerms)
T=2*pi;
w=1;
t = [0:0.1:2];
f = fft(sawtooth(t,0.5));
am = real(f);
bm = imag(f);
func = num2str(f(1));
for i = 1:numTerms
func = strcat(func,'+',num2str(am(i)),'*cos(',num2str(i*w),'*t)','+',num2str(bm(i)),'*sin(',num2str(i*w),'*t)');
end
y = inline(func);
plot(t,y(t));
end
Что не так с fft() – 0x90
Мне нужен коэффициент в форме, подходящей для аппроксимации функции с помощью синусов и косинусов, и я действительно не знаю, как получить ответ, который дает fft для этой формы, поэтому я думал, что это может быть проще. – Rick
БПФ использует в подынтегральном выражении выражение exp (i x) = cos (x) + i sin (x), поэтому для получения частей cos и sin вам просто нужно взять реальную и мнимую части. – roadrunner66