Цель работы: анализ динамики частотных характеристик физической системы и особенностей представления работы сисстемы в ЭВМ.
Исследование имеет целью разработку алгоритма, который в реальном времени по данным измерения дискретизованного с заданной частотой выходного сигнала позволяет определить номер режима в котором работает система.
Работа системы в стационарном режиме имитируется программой dtmp.m. Номера режимов и соответствующие значения параметров системы, при которых надлежит провести исследование составляют спецификацию индивидуального задания.
Инстументарий для выполнения анализа представлен в виде программ, написанных на языке Matlab 3.5.
Итогом исследования является вариант параметрического описания набора цифровых фильтров, применение которых к сигналам системы позволит определить состояние системы, и алгоритм принятия решения по результатам фильтрации.
Номер варианта |
sens |
tt мксек |
pp мксек |
Частота дискр-ии |
Н-ра режимов работы |
1 |
0.04 |
30 |
120 |
8000 |
0,..,3 |
2 |
0.2 |
40 |
140 |
16000 |
3,..,6 |
3 |
0.02 |
20 |
60 |
22400 |
1,..,4 |
4 |
0.03 |
25 |
40 |
8000 |
6,..,9 |
5 |
0.04 |
15 |
90 |
16000 |
0,..,3 |
6 |
0.06 |
60 |
180 |
22400 |
3,..,6 |
7 |
0.08 |
15 |
50 |
8000 |
1,..,4 |
8 |
0.01 |
10 |
60 |
16000 |
6,..,9 |
9 |
0.1 |
25 |
100 |
22400 |
0,..,3 |
10 |
0.01 |
10 |
70 |
8000 |
3,..,6 |
11 |
0.04 |
30 |
120 |
16000 |
1,..,4 |
12 |
0.2 |
40 |
140 |
22400 |
6,..,9 |
13 |
0.02 |
20 |
60 |
8000 |
0,..,3 |
14 |
0.03 |
25 |
40 |
16000 |
3,..,6 |
15 |
0.04 |
15 |
90 |
22400 |
1,..,4 |
16 |
0.06 |
60 |
180 |
8000 |
6,..,9 |
17 |
0.04 |
30 |
120 |
16000 |
0,..,3 |
18 |
0.01 |
10 |
60 |
16000 |
6,..,9 |
19 |
0.1 |
25 |
100 |
22400 |
0,..,3 |
20 |
0.01 |
10 |
70 |
8000 |
3,..,6 |
21 |
0.04 |
30 |
120 |
16000 |
1,..,4 |
22 |
0.2 |
40 |
140 |
22400 |
6,..,9 |
23 |
0.02 |
20 |
60 |
8000 |
0,..,3 |
24 |
0.03 |
25 |
40 |
16000 |
3,..,6 |
25 |
0.04 |
15 |
90 |
22400 |
1,..,4 |
function cont=dtmp(t)
% global tt pp
% floor(a)) - округляет элементы a до
% ближайшего в направлении к (-inf) значения
t1=t-(tt+pp)*floor(t./(tt+pp));
% t1 - остаток от деления t на период (tt+pp)
cont=(t1<=tt).*(0.9+t1/tt*0.1);
% cont = 0, если доля t1 в (tt+pp) больше tt,
% иначе - cont растет от 0.9 до 1
cont=cont(:);
**************************************************************
Примеры исследования спектра и верификации предлагаемых алгоритмов
приведены в виде последовательности скриптов
tst1
tst2
filt1
filt2
filttst
Последовательность исполнения существенна.
В отчет включить параметры фильтров (тип,частотный диапазон, ко-
эффициенты в формате long) и константы порогов принятия решений
*************************************************************
tst1.m
*************************************************************
% tst1 - моделирует работу стенда с аналоговым
% представлением данных - на экране осцилографа
% dtmp - функция, моделирующая
% температурно-зависимый генератор импульсов
clear all % Очистка памяти
diary tst1.txt % Включение записи
% текстовых обменов в протокольный файл tst1.txt
global tt pp sens % Описание глобальных переменных, используемых
% в tst1 и tst2
sens=0.02; % Условная характеристика термочувствительности
% генератора, определяемая типом транзистора
% и режимом его работы
Tdiap=2 % При температурных градациях i=0:(Tdiap-1)
% исследуем спектр колебаний
N=256; % Длина блока, допустимого по ограничениям памяти
tt=35*10^(-6); % Длина токовой фазы
pp0=3*tt; % Длина бестоковой фазы при нулевой температуре
fd=10^6; % Частота дискретизации для имитации осцилограммы
% fd=8000; % Частота дискретизации для зв. карты
% fd=16000; % Частота дискретизации для зв. карты
fs=fd/2 % Частота Найквиста
step=1/fd; % Интервал дискретизации
t=0:step:step*(N-1); % Массив временных отсчетов для осцилограммы
at=length(t); % Его длина
yy=[]; % Инициализация массива данных амплитуд
for ts=0:(Tdiap-1) % Начало цикла по температуре
pp=(1-sens*ts)*pp0 % Изменяем настройку:
% в соответствии с ростом температуры
% уменьшается длина бестоковой фазы
y=dtmp(t+rand); % Моделируем блок данных от генератора со
% случайной фазой
%y=detrend(y,0);
yy=[yy,y]; % Добавляем его в массив
end % Конец цикла по температуре
xp=max(t);yp=max(yy(:,1)*7/8);
% plot(t(1:N/8),yy(1:N/8,:)),title(' График во временной области ')
plot(t,yy),title(' График во временной области ')
text(xp*0.6,yp,['Чувствительность =',num2str(sens)]),grid,pause
% Графики во временной области
% частоты
save tst1
*************************************************************
*************************************************************
tst2.m
*************************************************************
% tst2 для dtmp - Функция, моделирующая
% температурно-зависимый генератор импульсов
clear all % Очистка памяти
load tst1 % Загрузка глобальных переменных
diary tst2.txt % Включение записи
% текстовых обменов в протокольный файл tst2.txt
global tt pp sens % глобальные переменные
% sens - Условная характеристика термочувствительности
% генератора, определяемая типом транзистора и режимом его работы
Tdiap=2 % - при температурных градациях i=0:(Tdiap-1)
% исследуем спектр колебаний
% N=256; длина блока, допустимого по ограничениям памяти
fd=8000; % Частота дискретизации для зв. карты - Версия 1
% fd=16000; % Частота дискретизации для зв. карты - Версия 2
fs=fd/2 % Частота Найквиста
step=1/fd; % Интервал дискретизации
t=0:step:(N-1)*step; % Массив временных отсчетов
at=length(t); % Его длина
gg=floor(log(at)/log(2));
% gg - наименьший показатель степени, для которой
% 2^gg укладывается на считанном блоке отсчетов
ffl=2^(gg+1); % Длина FFT, возможно, с дополнительными нулями
rr=1:ffl/2; % Берем значимую область частот,
% удаляя симметричные данные
rr=rr(:); % Преобразуем в вектор-колонку
lr=length(rr); % Длина этого вектора
axe=2:lr; % Это нужно для удаления нулевой компоненты,
% которая сответствует 1-му члену ряда Фурье
aftt=[]; % Инициализация массива мощностей частотных компонент
q12=[]; % Инициализация массива мощностей и
% номеров частотных компонент
yy=[]; % Инициализация массива данных амплитуд
for ts=0:(Tdiap-1) % Начало цикла по температуре
pp=(1-sens*ts)*pp0 % Изменяем настройку:
% в соответствии с ростом температуры
% уменьшается длина бестоковой фазы
y=dtmp(t+rand); % Моделируем блок данных от генератора
% y=detrend(y,0); % Эта функция удалит постоянную составляющую
yy=[yy,y]; % Добавляем блок данных в массив
ft=fft(y,ffl); % Находим Фурье-представление данных
rr=ft(axe); % Удалим нулевую компоненту спектра
pow=rr.*conj(rr); % Находим мощности спeктральных компонент
aftt=[aftt,pow]; % Добавляем вектор мощностей спектра в массив afft
% для построения графика
[q1,q2]=sort(pow); % Сортируем pow по возрастанию мощностей,
% сохраняя номера в q2
q12=[q12,q1,q2]; % Добавим в q12 номера и энергии ведущих компонент
end % Конец цикла по температуре
nmax=q12(lr-1:-1:lr-6,:); % Массив номеров и энергий
% максимальных спектральных компонент
xp=max(t); yp=max(yy(:,1)*7/8);
% plot(t(1:N/3),yy(1:N/3,:)),title(' График во временной области ')
% Этот график использует только первую треть данных
plot(t(1:N),yy(1:N,:)),title(' График во временной области ')
text(xp*0.6,yp,['Чувствительность =',num2str(sens)]),grid,pause
% Графики во временной области
% но на частичном временном отрезке
plot(axe*fd/ffl,aftt),title('Спектральные плотности '),grid,pause
% Графики во частотной области
disp(['Цена деления по шкале частот=', num2str(fd/lr)]);
disp(['Частота Найквиста=', num2str(fs)]);
disp(['Мощности и номера ведущих спектральных компонент']);
nmax, pause
disp(['Ведущие спектральные частоты (гц) ']);
fmax=fd/ffl*nmax(:,2:2:2*Tdiap) % Переводим номера ведущих
% компонент в соответствующие частоты
save tst2
*************************************************************
*************************************************************
filt1.m
*************************************************************
load tst2 % Загрузка переменных, вычисленных в tst2
diary filt1.txt % Включение записи
% текстовых обменов в протокольный файл filt1.txt
global tt pp sens % глобальные переменные
% Спроектируем полосовай фильтр Баттеруорта
% пропускающий частоту, которая доминирует на
% первом температурном уровне и не проявляется на
% других
% Данные о доминирующих частотах
% 1.0e+003 *
% 0.8594 0.7500
% 0.8438 0.0156
% 0.0156 1.5000
% 1.7188 0.7344
% 0.8750 0.7656
% 1.7031 1.4844
format long
[b1,a1]=butter(5,[800,900]/4000)
format
% Проверим, что фильтр действительно пропускает
% значительно лучше первую кривую, чем вторую
u=[];
for ts=1:2 % Начало цикла по температуре
uu=yy(:,ts);
uu=filter(b1,a1,uu);
u=[u,uu];
plot(t(1:N),u(1:N,:)),title(' График во временной области '),grid,pause
end
save tst2
% Теперь можно дать колличественную оценку результату фильтрации
id=mean(abs(u))
% Напоминание: использованы функции MEAN - "среднее"
$ и ABS - "абс. значение".
% MEAN Average or mean value. For vectors, MEAN(X) is the mean
% value of the elements in vector X. For matrices, MEAN(x)
% is a row vector containing the mean value of each column.
% ABS ABS(X) is the absolute value of the elements of X. When
% X is complex, ABS(X) is the complex modulus (magnitude) of
% the elements of X. See also ANGLE.
*************************************************************
*************************************************************
filt2.m
*************************************************************
load tst2 % Загрузка переменных, вычисленных в tst2
diary filt1.txt % Включение записи
% текстовых обменов в протокольный файл filt1.txt
global tt pp sens % глобальные переменные
% Спроектируем фильтр на частоту, доминирующую на
% втором температурном уровне и не проявляющуюся
% на других
% Данные о доминирующих частотах
% 1.0e+003 *
% 0.8594 0.7500
% 0.8438 0.0156
% 0.0156 1.5000
% 1.7188 0.7344
% 0.8750 0.7656
% 1.7031 1.4844
format long
[b2,a2]=butter(5,[1450,1550]/4000)
format
u=[];
for ts=1:2 % Начало цикла по температуре
uu=yy(:,ts);
uu=filter(b2,a2,uu);
u=[u,uu];
plot(t(1:N),u(1:N,:)),title(' График во временной области '),grid,pause
end
save tst2
% Теперь можно дать колличественную оценку результату фильтрации
id=mean(abs(u))
*************************************************************
*************************************************************
filttst.m
*************************************************************
load tst2 % Загрузка переменных, сохраненных
% после вычислений в filt1 и filt2 в tst2
diary filttst.txt % Включение записи
% текстовых обменов в протокольный файл
global tt pp sens % глобальные переменные
% Теперь можно проверить алгоритм
% распознавания по результату фильтрации
for ts=0:(Tdiap-1) % Начало цикла по температуре
pp=(1-sens*ts)*pp0 % Изменяем настройку:
% в соответствии с ростом температуры
% уменьшается длина бестоковой фазы
y=dtmp(t+rand); % Моделируем блок данных от генератора
% y=detrend(y,0); % Иногда это улучшает работу
yy=[yy,y]; % Добавляем его в массив
end % Конец цикла по температуре
u1=[];
% Оба фильтра применим к отсчетам 1-го режима
uu=yy(:,1); % Считаем данные 1-го режима
u1=[u1,filter(b1,a1,uu)]; % Пропустим через фильтры
u1=[u1,filter(b2,a2,uu)];
plot(t(1:N),u1(1:N,:)),title(' График во временной области: 1-й режим'),grid,pause
u2=[]; % Оба фильтра применим к отсчетам 2-го режима
uu=yy(:,2); % Считаем данные 2-го режима
u2=[u2,filter(b1,a1,uu)]; % Пропустим через фильтры
u2=[u2,filter(b2,a2,uu)];
plot(t(1:N),u2(1:N,:)),title(' График во временной области: 2-й режим'),grid,pause
save filttst
% Теперь можно дать колличественную оценку результату фильтрации
id1=mean(abs(u1))
id2=mean(abs(u2))
*************************************************************
Теперь в качестве порога для принятия решения в пользу одного из решений достаточно провести раздел по значению bound=(id1+id2)/2.