|
|
  |
Цикл for и формирование отсчетов sin |
|
|
|
Mar 16 2016, 09:09
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Столкнулся с непоняткой в использовании цикла for Имеется тестовый код Код % исходная частота сигнала f = 90000; % период частоты T = 1/f; % частота выборок 360 кГц fs = 360000; % начало модели tmin = 0; % конец модели tmax = 5*T; % шаг моделирования dt = T/4; % цикл моделирования t = tmin:dt:tmax; xc = cos(2*pi*f*t); pl = conv(xc, 4); figure plot(t,xc,'r'); hold on stem(t,xc); который работает верно и дает правильные отсчеты sin Но если для формирования отсчетов использовать for Код for t = tmin:dt:tmax; xc = cos(2*pi*f*t); end то все отсчеты равны 1 Подскажите пожалуйста как правильно формировать отсчеты через for, поскольку есть необходимость применять for.
|
|
|
|
|
Mar 16 2016, 09:18
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 17-08-11
Пользователь №: 66 760

|
В первом случае xc является массивом, а во втором случае - скаляром (в цикле xc постоянно перезаписывается). Соответствующие результаты на графике plot.
|
|
|
|
|
Mar 16 2016, 09:22
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(MiPe @ Mar 16 2016, 12:18)  В первом случае xc является массивом, а во втором случае - скаляром (в цикле xc постоянно перезаписывается). Соответствующие результаты на графике plot. Спасибо. Понятно. Но если сделать так Код xc=zeros(1,20); n = 0; for t = tmin:dt:tmax; n = n + 1; xc(n) = cos(2*pi*f*t); end то получается все то же самое. Как правильно записать отсчеты сигнала в массив с помощью for?
|
|
|
|
|
Mar 16 2016, 09:58
|
Местный
  
Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771

|
Цитата(Acvarif @ Mar 16 2016, 12:22)  Спасибо. Понятно. Но если сделать так Код xc=zeros(1,20); n = 0; for t = tmin:dt:tmax; n = n + 1; xc(n) = cos(2*pi*f*t); end то получается все то же самое. Как правильно записать отсчеты сигнала в массив с помощью for? потому что ты после делаешь plot(t,xc,'r'); а t после цикла - скаляр (равна tmax) и да еще, не понятно зачем ты вообще хочешь юзать for
--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
|
|
|
|
|
Mar 16 2016, 10:43
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(Realking @ Mar 16 2016, 12:58)  потому что ты после делаешь plot(t,xc,'r'); а t после цикла - скаляр (равна tmax)
и да еще, не понятно зачем ты вообще хочешь юзать for Первое что пришло в голову для создания матрицы сигнала. Очевидно можно и linspace..
Сообщение отредактировал Acvarif - Mar 16 2016, 10:49
|
|
|
|
|
Mar 16 2016, 19:33
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(mdmitry @ Mar 16 2016, 18:40)  Хорошим стилем для MATLAB является использование циклов только в случае крайней необходимости. Встроенные средства языка работают существенно быстрее явно написанных циклов. На коротких массивах на современных компьютерах этого можете не почувствовать. Да. Понимаю. Пытаюсь приспособиться. Вот матрица сигнала на базе linspace Код f=90000; fs = 4*f; N = 20; T = 1/f; w=2*pi*f; tmax = N*T; t=linspace(0,tmax,fs*tmax + 1); x = cos(w*t); fprintf(' %d\n', x); figure plot(x,'r'); hold on stem(x);
figure plot(abs(fft(x)))% absolute spectrum of x матрица коэффициентов Код % матрица коэффициентов 51 коэффициент kf = [0 116 0 -214 0 354 0 -540 0 772 0 -1042 0 1339 0 -1645 0 1939 ... 0 -2199 0 2403 0 -2533 0 2577 0 -2533 0 2403 0 -2199 0 1939 ... 0 -1645 0 1939 0 -1042 0 772 0 -540 0 354 0 -214 0 116 0]; Вообще стоит задача получить отсчеты свертки КИХ фильтра с децимацией на 5 используя коэффициенты в десятичном исполнении для ПЛИС как-бы надвигая матрицу сигнала на матрицу коэффициентов Думаю без циклов тут не обойтись при всей мощи Матлаб.
Сообщение отредактировал Acvarif - Mar 16 2016, 20:17
|
|
|
|
|
Mar 17 2016, 11:33
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(Maverick @ Mar 17 2016, 13:48)  почему Вы не используете готовый продукт? fdatool - предназначена для расчета фильтров... Конечно-же использую. Иначе откуда появились-бы коэффициенты фильтра. Пытаюсь глубже приобщиться к Матлаб путем повторения ЦОС уже выполненой в ПЛИС. Поскольку дальнейшие задачи ЦОС становятся все сложнее то выполнять сразу все в ПЛИС уже стремно. Желательно пропустить через Матлаб. Как-то так... Вот застрял на том как можно обнулять нужное количество элементов в матрице Например в матрице сигнала. Код t=linspace(tmin, tmax+tmin, fs*tmax+1); % матрицs сигналов x1 = A*sin(w1*t); Пытаюсь смоделировать типа "наползание и сползание" матрицы сигнала на матрицу коэффициентов с течением времени.
Сообщение отредактировал Acvarif - Mar 17 2016, 11:47
|
|
|
|
|
Mar 20 2016, 09:56
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Вот, что получилось: CODE %% инициализация
clc; clear all; f1 = 90000; % центральная частота Гц f2 = 70000; % центральная частота Гц fs = 360000; % частота дискретизации Гц A = 2047; % амплитуда сигнала ts = 1/fs; % период одного дискрета tm = 50; % количество проходов участка моделирования tm_test = tm*4; % общее количество проходов моделирования td = 5; % коэффициент децимации w1=2*pi*f1; % круговая частота 1 w2=2*pi*f2; % круговая частота 2 tmin = 0; % начальное время (начальная фаза) tmax = tm*ts; % конечное время tmax_test = tm_test*ts; % конечное время
% матрица коэффициентов 51 коэффициент (Equiripple 75-85-95-105 кГц) kf = [0,-834,0,283,0,-202,0,8,0,307,0,-738,0,1260,0,-1836,0,2417, ... 0,-2947,0,3372,0,-3647,0,3742,0,-3647,0,3372,0,-2947,0, ... 2417,0,-1836,0,1260,0,-738,0,307,0,8,0,-202,0,283,0,-834,0]; %lkf =length(kf); % количество коэффициентов % матрица времени t=linspace(tmin, tmax_test+tmin, fs*tmax_test+1); % матрица сигнала 90 кГц x1 = A*sin(w1*t); x1(1:60) = 0; x1(140:201) = 0; % матрица сигнала 70 кГц x2 = A*sin(w2*t); x2(1:60) = 0; x2(140:201) = 0;
%% моделирование
zr1=zeros(1,200); zr2=zeros(1,200); for tm_mod = 1:tm_test % поэлементное умножение if tm_mod < 150 z1 = x1(tm_mod:(tm_mod+50)).*kf; z2 = x2(tm_mod:(tm_mod+50)).*kf; end % матрица выходных данных КИХ для 70 кГц и 90 кГц zr1(tm_mod) = round(sum(z1)); zr2(tm_mod) = round(sum(z2)); end
% максимальное значение fprintf('Максимальное значение 90 кГц %d\n', max(zr1)); fprintf('Максимальное значение 70 кГц %d\n', max(zr2)); fprintf('\n');
%% графика
% выборки по сигналу x1 figure(1) plot(x1, 'r'); hold on stem(x1);
% графика элементов массива zr1 figure(2) plot(zr1, 'r'), grid; hold on stem(zr1);
% графика элементов массива zr2 figure(3) plot(zr2, 'r'); hold on stem(zr2);
% absolute spectrum of x1 figure (4) plot(abs(fft(x1))) Можно-ли в таком моделировании обойтись без цикла for? Тоесть сформировать матрицу результата без цикла.
Сообщение отредактировал Acvarif - Mar 20 2016, 09:57
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|