Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Рожденная для битвы
 Аватар для marina2
294 / 72 / 15
Регистрация: 08.11.2009
Сообщений: 1,272

Фильтрация

01.12.2013, 23:46. Показов 1708. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам

Помогите подобрать фильтр, чтобы выравнить сигнал
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
seq = [1 0 1 0 1 0 ]; % некая кодовая последовательность(в данном случае М)
numberOfPeriods = 2; % длина элементарного импульса в периодах несущей
phaseSteps = seq * pi;
 
Ampl = 5; % ам не используется
 
Fs = 500000; % частота дискретизации
fc = 100; % несущая
 
chipDuration = numberOfPeriods / fc; % длительность элементарного импульса
fullLength = ceil(length(seq) * chipDuration * Fs); % длина сигнала в отсчетах
phase = zeros(1, fullLength);
 
 
 
phase = zeros(1, fullLength);
currPhase = phaseSteps(1);
FlipIdxReal = chipDuration * Fs;
 
ChipIdx = 1;
PrevChipIdx = 1;
 
for i=1:fullLength
   
    phase(i) = currPhase;
    
    currPhase = currPhase + 2*pi*fc/Fs;
    if i>FlipIdxReal
        PrevChipIdx = ChipIdx;
        ChipIdx = ChipIdx + 1;
     
        currPhase = currPhase + phaseSteps(ChipIdx) - phaseSteps(PrevChipIdx);
        FlipIdxReal = FlipIdxReal + chipDuration * Fs;
    end;
end;
 
signal = Ampl * sin(phase);
noiseLevel = 1;
noise = noiseLevel * randn(1, length(signal));
noisedSignal = signal + noise;
 
subplot(2,1,1);
 
[a, b]=size(seq);
seq(b+1) = 1;
stairs(seq) ;
AXIS([1 7 -1 2])
title ('Исходный сигнал');
subplot(2,1,2);
plot(noisedSignal);
title ('Фазовая манипуляция');
 
figure;
phase(1) = 1;
for i=2:fullLength
   
    phase(i) = phase(i-1) + 2*pi*fc/Fs;  
end
sample1=Ampl * sin(phase)
d = (sample1 - noisedSignal).^2;
plot(d);
 
k=1;
 
FlipIdxReal=FlipIdxReal-FlipIdxReal;
for i=1:fullLength
    if i>FlipIdxReal
        if d(i)>50
            nseq(k)= 1
        else 
            nseq(k)=0
        end;
        k = k+1;
        FlipIdxReal = FlipIdxReal + chipDuration * Fs;
    end;
end;
 
f = 0 : Fs/fullLength : Fs - Fs/fullLength;
figure
xw=abs(fft(d));
plot(f(1 : fullLength/2), xw(1 : fullLength/2))
title('Спектор')
 
 
 
a0=1;
a1=5.5610;
a2= 0.6414;
 
b0=0.0201;
b1=0.0402;
b2=0.0201;
 
A=[a0, a1, a2];
B=[b0, b1, b2];
f1 = 100;
figure;
y1 = filter(B, A, d);
%y2 = ifft(fft(d).*fft(B, fullLength)./fft(A, fullLength));
plot(y1);
axis([0 2/f1 -1 1]);
title('Filter in time')
 
figure;
spy1 = abs(fft(xw));
plot(f, spy1, 'g');
title('Filter in frequency')
 
inT = ifft(spy1);
figure;
plot (inT);
AXIS([1 70 0 100])
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2013, 23:46
Ответы с готовыми решениями:

Вейвлет-фильтрация
Я хорошо понимаю, что такое фильтр на основе БПФ. После преобразования БПФ я зануляю все ненужные частоты и возвращаюсь ко временному...

Фильтрация сигналов
Здравствуйте, товарищи форумчане! Столкнулся с необходимостью обработки сигналов цифровыми фильтрами, и в связи с этим возникли некоторые...

Фильтрация сигнала
Здравствуйте, нужна помощь. Имеется Сигнал (S), Помеха (P), Наложенная помеха на сигнал (S+P). Можно ли, применив фильтр Баттерворта и...

3
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
02.12.2013, 17:37
ой, что это?
Цитата Сообщение от marina2 Посмотреть сообщение
seq = [1 0 1 0 1 0 ]; % некая кодовая последовательность(в данном случае М)
нет, это не м-последовательность.
Цитата Сообщение от marina2 Посмотреть сообщение
подобрать фильтр, чтобы выравнить сигнал
выровнять с чем? Что вы имели ввиду? После беглого обзора кода, я подумал, (возможно ошибочно) что вы хотите выполнить демодуляцию этого сигнала, чтобы получить исходную информационную последовательность. Посмотрим внимательнее:
Matlab M
1
2
3
4
5
6
7
8
phase(1) = 1;
for i=2:fullLength
   
    phase(i) = phase(i-1) + 2*pi*fc/Fs;  
end
sample1=Ampl * sin(phase)
d = (sample1 - noisedSignal).^2;
plot(d);
что тут происходит? Вы генерируете синус на несущей довольно странным способом. Можно было использовать одну строку sin(w*t+p0). Плавно бегущая фаза удобнее для формирования переходов, как во фрагменте выше. А тут фаза нарастает линейно. Затем вы этот синус вычитаете из исходного сигнала(или наоборот, не важно в данном случае) и возводите в квадрат. Зачем это все?
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
FlipIdxReal=FlipIdxReal-FlipIdxReal;
for i=1:fullLength
    if i>FlipIdxReal
        if d(i)>50
            nseq(k)= 1
        else 
            nseq(k)=0
        end;
        k = k+1;
        FlipIdxReal = FlipIdxReal + chipDuration * Fs;
    end;
end;
Тут если я правильно понял, вы пользуетесь тем, что bpsk сигнал одновременно и амплитудно манипулированный и пытаетесь применить пороговое декодирование. Можно конечно, но это плохой способ. Почему бы не применить более классический способ демодуляции - умножения на опорное колебание и фильтрацию? Например так:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
title ('Фазовая манипуляция');
 
ss = noisedSignal .* sin(2*pi*fc*(0:length(noisedSignal)-1)/Fs);
% figure; plot(ss)
FsFc = Fs/fc;
b = ones(1, FsFc)/FsFc;
envelope = filter(b, 1, ss);
% figure; plot(envelope)
chipLen = chipDuration * Fs;
k=1;
for i=0:fullLength-1
    if mod(i, chipLen) == 0
        nseq(k) = mean(envelope(i+1:i+chipLen));
        k = k+1;
    end
end
nseq = (1-sign(nseq))/2;
figure; stairs([nseq 0]); axis([1 length(nseq)+1 -1 2])
По моему это более простой и надежный способ, хотя есть некоторые уточнения:
- Для построения огибающей я умножаю на опорный синус, т.к. знаю что у вас при генерации сигнала используется синусная фаза. В общем случае нужно анализировать комплексную огибающую
- Для фильтрации я использую наверно самый простой способ - скользящее среднее. Можно использовать фильтр получше
- Для получения информационного символа я усредняю огибающую на длине чипа. Можно просто использовать децимацию, но так мне кажется надежнее.
- Естественно чтобы использовать сие на практике нужна синхронизация, иначе прием должен быть когерентным.
1
Рожденная для битвы
 Аватар для marina2
294 / 72 / 15
Регистрация: 08.11.2009
Сообщений: 1,272
02.12.2013, 20:56  [ТС]
vital792, мне нужно еще демодулировать сигнал, поэтому я применяю фильтр (мне преподаватель подсказал) чтобы сигнал стал более "прямоугольным"

Надо расшифровать сигнал, который на рисунке
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
02.12.2013, 21:24
marina2, перечитайте подробнее мое сообщение, особенно вторую половину. Там я привел пример демодуляции вашего сигнала "почти классическим" методом. У меня получился упрощенный "недоквадратурный" метод))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.12.2013, 21:24
Помогаю со студенческими работами здесь

Цифровая фильтрация
Доброго времени суток! с цифровой обработкой сигналов только начинаю разбираться, есть практическая задача (см.фото) часть сделал, а вот с...

Фильтрация голоса
Добрый день! У меня есть файл, в котором заданы амплитуды сигнала. Я его могу считать, проиграть и т.д : clc; clear all; close...

Фильтрация в Matlab
Добрый вечер. Необходимо произвести фильтрацию массива на подобие фильтрации екселя,т.е. отформатировать массив так чтобы получился...

Адаптивная фильтрация
Добрый день, Такая вот у меня задачка Создать сигнал частатой= 140 Гц и амплитудой = 0.6-1.5 мВ Зашумить его Далее уже...

Адаптивная фильтрация
Здравствуйте. Пытаюсь заставить работать адаптивный фильтр. Алгоритм RLS. Нашел статью в которой описывается как раз то, что нужно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru