acvarif 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Столкнулся с непоняткой в использовании цикла 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
peselnik 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба В первом случае xc является массивом, а во втором случае - скаляром (в цикле xc постоянно перезаписывается). Соответствующие результаты на графике plot. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба В первом случае 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Спасибо. Понятно. Но если сделать так 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 марта, 2016 Опубликовано 16 марта, 2016 (изменено) · Жалоба потому что ты после делаешь plot(t,xc,'r'); а t после цикла - скаляр (равна tmax) и да еще, не понятно зачем ты вообще хочешь юзать for Первое что пришло в голову для создания матрицы сигнала. Очевидно можно и linspace.. Изменено 16 марта, 2016 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Но если для формирования отсчетов использовать for Хорошим стилем для MATLAB является использование циклов только в случае крайней необходимости. Встроенные средства языка работают существенно быстрее явно написанных циклов. На коротких массивах на современных компьютерах этого можете не почувствовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 марта, 2016 Опубликовано 16 марта, 2016 (изменено) · Жалоба Хорошим стилем для 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 используя коэффициенты в десятичном исполнении для ПЛИС как-бы надвигая матрицу сигнала на матрицу коэффициентов Думаю без циклов тут не обойтись при всей мощи Матлаб. Изменено 16 марта, 2016 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 17 марта, 2016 Опубликовано 17 марта, 2016 · Жалоба Вообще стоит задача получить отсчеты свертки КИХ фильтра с децимацией на 5 используя коэффициенты в десятичном исполнении для ПЛИС как-бы надвигая матрицу сигнала на матрицу коэффициентов почему Вы не используете готовый продукт? fdatool - предназначена для расчета фильтров... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 17 марта, 2016 Опубликовано 17 марта, 2016 (изменено) · Жалоба почему Вы не используете готовый продукт? fdatool - предназначена для расчета фильтров... Конечно-же использую. Иначе откуда появились-бы коэффициенты фильтра. Пытаюсь глубже приобщиться к Матлаб путем повторения ЦОС уже выполненой в ПЛИС. Поскольку дальнейшие задачи ЦОС становятся все сложнее то выполнять сразу все в ПЛИС уже стремно. Желательно пропустить через Матлаб. Как-то так... Вот застрял на том как можно обнулять нужное количество элементов в матрице Например в матрице сигнала. t=linspace(tmin, tmax+tmin, fs*tmax+1); % матрицs сигналов x1 = A*sin(w1*t); Пытаюсь смоделировать типа "наползание и сползание" матрицы сигнала на матрицу коэффициентов с течением времени. Изменено 17 марта, 2016 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 20 марта, 2016 Опубликовано 20 марта, 2016 (изменено) · Жалоба Вот, что получилось: %% инициализация 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? Тоесть сформировать матрицу результата без цикла. Изменено 20 марта, 2016 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться