|
|
  |
Операция обратная к "скользящему среднему" |
|
|
|
Jan 16 2014, 20:00
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата Stanislav: Можно организовать "демпфирование" и "подкачку" такого резонатора. Тогда его разносить не будет. Цена - некоторая дополнительная погрешность, которую можно минимизировать в соответствии с разрядными возможностями. Зато просто, как тапочек. Те сместить полюс внутрь единичной окружности и подать вход. Это не наш метод. Лучше тогда полиномом...
|
|
|
|
|
Jan 16 2014, 22:20
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(Tarbal @ Jan 17 2014, 00:59)  Век живи -- век учись. Даже не могу себе представить рекурсивный фильтр скользящего среднего. Разве такое бывает? thermit, ликбез пора заканчивать, не в коня корм. -------------------- "Генератор" одной "синусоиды". Легко можно расширить до целой вязанки. Для этого нужно увеличить количество пар полюсов (порядок фильтра). Но подкачку придётся делать посложнее. Код N=3; Damp=0.99;
y=zeros(1,1000); y(1)=0.01;
a=ones(1,N); a(2)=-1.8; % "частота" b=N;
a=a.*(Damp.^[0:(N-1)]); % сдвиг полюсов
for (i=3:length(y)+1) y(i)=-a(2)*y(i-1)-a(3)*y(i-2); if(y(i)*y(i-1)<0) y(i)=y(i)+0.01*sign(y(i)); end end
figure (1) plot (y) grid on
clear all; Затухание выбрано большим намеренно. Должно пойти даже на малоразрядной арифметике, где с полиномами будет совсем плохо. ЗЫ. Вот картинки. Ничего не напоминают?
 Выходной сигнал не так уж плох для столь малой "добротности" резонатора и примитивного способа подкачки:
Сообщение отредактировал Stanislav - Jan 16 2014, 22:50
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Jan 17 2014, 00:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(ViKo @ Jan 17 2014, 00:13)  y(n) = y(n-1) + x(n) - x(n - N) Ах вот оно что. Термит как раз обратный этому фильтру восстанавливающий фильтр приводил. Цитата(Stanislav @ Jan 17 2014, 01:20)  thermit, ликбез пора заканчивать, не в коня корм. Какой вы приятный собеседник.
|
|
|
|
|
Jan 17 2014, 04:58
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Stanislav @ Jan 17 2014, 02:20)  "Генератор" одной "синусоиды". Легко можно расширить до целой вязанки. Для этого нужно увеличить количество пар полюсов (порядок фильтра). Но подкачку придётся делать посложнее. Т.е. идея состоит в том, чтобы с помощью нелинейности компенсировать демпфирование фильтра или другими словами сделать более добротный фильтр средствами менее точной арифметики?
--------------------
ну не художники мы...
|
|
|
|
|
Jan 17 2014, 06:01
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(alex_os @ Jan 17 2014, 08:58)  Т.е. идея состоит в том, чтобы с помощью нелинейности компенсировать демпфирование фильтра или другими словами сделать более добротный фильтр средствами менее точной арифметики? Это не совсем фильтр, а именно генератор колебаний, близких к гармоническим. Да, при малой разрядности будет работать. Не считая "подкачки", на получение отсчёта одного тона требуется всего 2 операции умножения и 1 операция сложения. Качество выходного сигнала становится особенно хорошим, если период сигнала выбирается кратным целому числу отсчётов. Вот текст недописанной программы, с которым можно поиграться. Код S=1; % количество сигналов
N=2*S+1;
Per_1=[20 30]; % период сигнала в отсчётах (дробный допустим)
Damp=0.99; % затухание Push=(1-Damp);
y=zeros(1,10000); y(1)=Push;
a1=ones(1,N); a1(2)=-2*cos(2*pi/Per_1(1)); %
a=a1;
%------------
a=a.*(Damp.^[0:(N-1)]); % сдвиг полюсов
for (i=3:length(y)+1) y(i)=sum(-a(2:N).*y(i-(1:N-1))); if(y(i)*y(i-1)<0) y(i)=y(i)+Push*sign(y(i)); % "подкачка" end end
figure (1) plot (y(1:1000)) grid on
yw = blackmanharris(2048).*y(7001:9048)'; Y = fft(yw); Ya= abs(Y(1:1024)); Ya=Ya/max(Ya);
figure(2) semilogy(0:1023, Ya) xlim ([0,1023]) ylim ([1e-4, 1]) grid on
clear all; ДПФ при периоде в 20 отсчётов:
Выходная последовательность содержит только нечётные гармоники основного тона.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
Guest_TSerg_*
|
Jan 17 2014, 06:13
|
Guests

|
// rate // r = (0..1] r := 0.005; // к примеру for i=0 to 800 p += r; if(p > 1) p -= 2; out = p*(1-abs(p)); Совсем простой sin-генератор
|
|
|
|
Guest_TSerg_*
|
Jan 17 2014, 10:42
|
Guests

|
Давно кем-то сказано - "чем проще, тем дешевле; чем дешевле, тем быстрее; чем быстрее - тем дороже".
|
|
|
|
|
Jan 17 2014, 10:57
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Да, на глаз я не различаю, что из них что.  Просто констатирую. "Кому и кобыла невеста" (с) "Ренгент покажет" (с) Код %% TSerg %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 2048; % Длина последовательности T = 4; % Количество периодов в последовательности
% rate r = 0..1 % r = 0.005; r = T / N * 2;
p = zeros(1, N); for (i = 2 : N) p(i) = p(i - 1) + r; if (p(i) > 1) p(i) = p(i) - 2; end g = 4 .* p .* (1 - abs(p)); % амплитуда равна 4 * 0.25 end
figure(1) plot(1 : N, g) xlim([0, N]) grid on
wg = blackmanharris(N) .* g(1 : N)'; sp = fft(wg); sp = abs(sp(1 : N)); sp = sp / max(sp);
figure(2) semilogy(1 : N, sp) xlim([0, N / 2]) ylim([1e-6, 1]) grid on
clear all;
Эскизы прикрепленных изображений
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|