Обработка результатов эксперимента
Напишем команды для очистки командного окна, очистки памяти от всех переменных и закрытия всех открытых графических окон.
clc
clear all
close all
Создадим два сигнала x1=cos(2*pi*f1*t); x2=4*cos(2*pi*f2*t). Частота дискретизации 4096, время анализа 1 секунда. Частоты f1 и f2 равны 100 и 350 Гц. Получим модуль спектра двух сигналов, построим графики (рис1 и рис2).
fs = 4096;
f1 = 100;
f2 = 350;
t = 0:1/fs:1-1/fs;
x1=cos(2*pi*f1*t);
x2=4*cos(2*pi*f2*t);
f = linspace(0, fs, length(x1));
abs(fft(x1))
abs(fft(x2))
figure()
subplot(2, 1, 1)
plot(t, x1, 'green')
xlim([0, 0.05]);
title('x1 signal');
subplot(2, 1, 2)
plot(f, abs(fft(x1)));
title('x1 amplitude spectrum');
figure()
subplot(2, 1, 1)
plot(t, x2, 'green')
xlim([0, 0.015]);
title('x2 signal');
subplot(2, 1, 2)
plot(f, abs(fft(x2)));
title('x2 amplitude spectrum');
Рис.2
Рис.1
Создадим еще два сигнала: x3=x1+x2; x4=x1.*x2 и постройте их спектры (рис.3 и рис.4).
x3 = x1+x2;
x4 = x1.*x2;
figure()
subplot(2, 1, 1)
plot(t, x3, 'green')
xlim([0, 0.05]);
title('x3 signal');
subplot(2, 1, 2)
plot(f, abs(fft(x3)));
title('x3 amplitude spectrum');
figure()
subplot(2, 1, 1)
plot(t, x4, 'green')
xlim([0, 0.017]);
title('x4 signal');
subplot(2, 1, 2)
plot(f, abs(fft(x4)));
title('x4 amplitude spectrum');
Рис.4
Рис.3
На временном интервале
отсчетов создадим
-импульс
и получим его спектр (рис.5).
При
смещении импульса меняется только
фаза.
N = 2^7;
t = 0:1/N:1-1/N;
delta = zeros(1, N);
delta(N/2+1)=1;
figure
subplot(3,1,1)
bar(t, delta, 'green')
grid on
title('delta')
subplot(3,1,2)
plot(t, abs(fft(delta)))
ylim([0 1.1])
grid on
title('abs spectrum')
subplot(3,1,3)
plot(t, angle(fft(delta)))
xlim([0 0.7])
grid on
title('phase spectrum')
Рис.5
В цикле последовательно будем увеличивать ширину импульса, наблюдая соответствующие изменения его спектра (рис.6). Сделаем 10 этапов моделирования.
N=2^7;
T=1;
dt=T/(N);
Nyq=N/(2*T); % nyquist frequency
df=1/T;
t = linspace(0,T,N);
for i=(1:10)
figure
T_h = i/100; % impuls hight duration
s = zeros(1, N);
s(N/2 +1 - (T_h/dt)/2 : N/2 + (T_h/dt)/2) = 1;
F=fft(s)/N;
subplot(2, 1, 1);
bar(t,s);%
ylim([-0.1, 1.1])
title('Impulse')
F1=F(1:N/2+1); % positive frequencies
F2=F(N/2+1:N); % negative frequencies
F=[F2,F1]; % full
nu=-Nyq+df*(0:N);
subplot(2, 1, 2)
plot(nu(1:N),abs(F(1:N)))
title('Spectrum')
end
Рис. 5
На том же временном интервале создадим периодический прямоугольный сигнал со скважностью 2 (меандр) и количеством периодов 4. Построим его спектр (рис.6).
N=2^7;
T=4;
dt=T/(N);
Nyq=N/(2*T); % nyquist frequency
df=1/T;
t = 0:1/1000:2;
signal = 0.5*square(2*pi*30*t)+0.5;
F=fft(signal)/N;
figure
subplot(2, 1, 1)
bar(t,signal)
axis([0 0.2 0 1.2])
xlabel("Time (sec)")
ylabel("Amplitude")
title("Square signal")
F1=F(1:N/2+1); % positive frequencies
F2=F(N/2+1:N); % negative frequencies
F=[F2,F1]; % full
nu=-Nyq+df*(0:N);
subplot(2, 1, 2) %bar(fft(abs(x2)), 10)
bar(nu(1:N),abs(F(1:N)), 'red')
ylim([-0.01, 0.1]);
xlim([1, 9]);
title('Spectrum')
Рис.6
Покажем базисные функции преобразования Фурье, Уолша и Хаара. Базис Уолша сформируем с помощью матрицы [1 1; 1 -1] и кронекеровского перемножения этой матрицы саму на себя. Построим графики (рис.7 и рис.8)
W_1 = [1, 1; 1, -1];
W = W_1;
for i = (1:5)
W = kron(W_1, W);
end
figure
subplot(2, 1, 1)
bar(t, signal)
ylim([-0.1, 1.1]);
xlim([0, 0.2]);
grid on
title('signal');
signal_W = fwht(signal); % fast Walsh transform
subplot(2, 1, 2)
%fw = 1:N;
bar(signal_W, 'black')
ylim([-0.01, 0.51]);
xlim([0, 30]);
grid on
title(' Walsh-transformed signal');
[cA, cD] = dwt(signal, 'haar'); % Haar transform
figure()
subplot(2, 1, 1);
plot(cA);
title('Haar Approximation Coefficients');
xlim([0, 600]);
subplot(2, 1, 2);
plot(cD);
title('Haar Detail Coefficients');
xlim([0, 600]);
Рис.8
Рис.7
Построим спектр с помощью преобразований из пункта 4 сигнала х1 из пункта 1, а затем сигнала из 5. Сравним их спектры (на рис.9 и рис.10).
N=2^7;
T=1;
fs=4096;
f1=100;
t = 0:1/fs:1-1/fs;
for i=(1:10)
figure()
T_h = i;
x1=cos(T_h*2*pi*f1*t);
F=fft(x1)/N;
subplot(2, 1, 1);
plot(t,x1);%
xlim([0.1, 0.15])
title('Signal')
subplot(2, 1, 2)
f = linspace(0, fs, length(x1));
plot(f, abs(fft(x1)), 'red', 'LineWidth',2)
title('Spectrum')
end
dt=T/(N);
Nyq=N/(2*T); % nyquist frequency
df=1/T;
t = 0:2*pi/N:2*pi - 2*pi/N;
for i=(1:10)
figure()
T_h = i;
signal = 0.5*square(T_h*2*pi*t)+0.5;
F=fft(signal)/N;
subplot(2, 1, 1)
plot(t/pi,signal)
xlim([0, 1])
xlabel("Time (sec)")
ylabel("Amplitude")
title("Square signal")
F1=F(1:N/2+1); % positive frequencies
F2=F(N/2+1:N); % negative frequencies
F=[F2,F1]; % full
nu=-Nyq+df*(0:N);
subplot(2, 1, 2) %bar(fft(abs(x2)), 10)
bar(nu(1:N),abs(F(1:N)), 'red')
title('Spectrum')
end
Рис.9
Рис.10
Определим форму и ширину частотной характеристики двух соседних каналов анализатора Фурье, изменяя частоту сигнала с достаточно малым шагом и выделяя из спектра отчет, принадлежащий выбранному каналу. Будем использовать окно Хеннинга. Результаты представлены на графиках (рис.11 и 12)
for j=(1:2)
chan_num =j;
freq_resolution=200;
window_type = 'hamming';
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
for i=(0.1:0.1:1)
figure()
f0=i;
x = cos(2*pi*f0*t);
window = hamming(L)';
x_windowed = x.*window;
X = fft(x_windowed);
f = Fs*(0:(L/2))/L;
for i = 1:length(f)
freq_response(i) = abs((X(i)));
if (f(i) >= (chan_num-0.5)*freq_resolution) && (f(i) <= (chan_num+0.5)*freq_resolution)
if ~exist('lower_freq_idx', 'var')
lower_freq_idx = i;
end
upper_freq_idx = i;
end
end
channel_width = f(upper_freq_idx) - f(lower_freq_idx);
bar(f, freq_response);
title('Frequency Response');
xlim([-50 50]);
ylim([0 600]);
grid on;
end
fprintf('Channel width: %.2f Hz\n', channel_width);
end
Рис.11
Рис.12
Построим частотную характеристику 3-х соседних каналов ДПФ. Меняя в частоту сигнала с шагом 0.01, запомним значение амплитуды каждого из 3-х каналов, построим их на графике (рис.13).
freq = 0:0.01:6*pi; % частоты
N = length(freq); % количество точек
channel1 = zeros(N, 1);
channel2 = zeros(N, 1);
channel3 = zeros(N, 1);
j=1;
for i = 1:N
% Модуль спектра для каждого канала
channel1(j) = abs(fft(cos(freq(i))));
channel2(j) = abs(fft(cos(2*freq(i))));
channel3(j) = abs(fft(cos(3*freq(i))));
j=j+1;
end
% Построение частотной характеристики
figure();
subplot(3,1,1)
plot(freq, channel1, 'r', 'LineWidth', 2);
title('freq__response_1')
subplot(3,1,2)
plot(freq, channel2, 'g', 'LineWidth', 2);
title('freq__response_2')
subplot(3,1,3)
plot(freq, channel3, 'b', 'LineWidth', 2);
title('freq__response_3')
Рис.13
