Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
3 / 2 / 1
Регистрация: 23.08.2016
Сообщений: 38
1

Как найти соотношение сигнал-шум

20.10.2016, 10:33. Просмотров 3259. Ответов 7
Метки нет (Все метки)

Всем добрый день, как найти соотношение сигнал-шум? Я знаю, что это отношение маскимума графика к СКО шумовой полки, но как это записать в формулу я не представляю.

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
clear all;
clc;
fs = 51e6; % частота дискретизации
fh = 1530e6; %частота гетеродинного преобразования
fc = 1575e6; %несущая частота GPS
collect_number = 20; %число накоплений
N = collect_number*fs/1000;
fileID = fopen('D:\no_jamm_2_10_10_0_0.txt');
C = textscan(fileID,'%f %f %f %f %f %f %f %f', N);
data = [C{1,:}]; %данные с первого АЦП
fclose(fileID);
ch_adc=[ 1 ]; %берем первый вход АЦП
 
I = zeros(1,max(size(data))); %формируем массив размером 1 х максимальную длину данных
Q = zeros(1,max(size(data)));
for i = ch_adc
    I = I + (data(:,2*i-1)-mean(data(:,2*i-1)))';
    Q = Q + (data(:,2*i)-mean(data(:,2*i)))';
end
IQ = I + 1i*Q;
 
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%                  GPS(ПСП GPS)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
% Функция предназначена для генерации псевдослучайного кода
% любого спутника GPS генерация 37 С/А кодов
% Sv_id - номер спутника
% cod - вектор, содержащий выходную последовательность
% g2s - вектор, содержащий соответствующие значения сдвига кода g2 для
% получения кода С/А требуемого спутника (например,
% для Sv_id=25 – используется сдвиг = 513)
% n- количество символов в последовательности
% сдвиг кода в соответствии с ICD-GPS-200C для 37 значений
g2s=[5;6;7;8;17;18;139;140;141;251;252;254;255;256;257;258;...
469;470;471;472;473;474;509;512;513;514;515;516;859;...
860;861;862;863;950;947;948;950];
g2shift=g2s(15);
 
%генерация кода G1
%начальное состояние регистра сдвига
n=1023;
shift_reg=-ones(1,10);
for i=1:n
g1(i)=shift_reg(10); %последовательность G1
%сложение (заменено умножением) по модулю 2 третьего и 10 разрядов регистра
modulo2=shift_reg(3)*shift_reg(10); %сдвиг разрядов 1:9
shift_reg(2:10)=shift_reg(1:9); %присвоение modulo2 первому разряду регистра
shift_reg(1)=modulo2;
end
g1;
% генерация кода G2 
% начальное состояние регистра сдвига
shift_reg=-ones(1,10);
for i=1:n
g2(i)=shift_reg(10); %последовательность G2
% сложение (заменено умножением) по модулю 2 второго,3,6,8,9,10
% разрядов регистра
modulo2=shift_reg(2)*shift_reg(3)*shift_reg(6)*shift_reg(8)...
*shift_reg(9)*shift_reg(10);% сдвиг разрядов 1:9
shift_reg(2:10)=shift_reg(1:9);% присвоение modulo2 первому разряду регистра 6
shift_reg(1)=modulo2;
end
g2;
% [G1_G2] = [g1; g2]';
% сдвиг G2 на соответствующее номеру спутника число бит
g2tmp(1:g2shift)=g2(n-g2shift+1:n);
g2tmp(g2shift+1:n)=g2(1:n-g2shift);
%Сохранение сдвинутого кода
g2=g2tmp; 
cod=g1.*g2; %формирование С/А кода поразрядным умножением G1 и G2
cod_bin=-(cod-1)/2; %формирование кода спутника GPS в двоичных символах
 
 
fcod = 1.023*10^6; %скорость передачи данных 
fs_fcod=(fs/fcod)/10; %отношение частоты дискретизации к символьной скорости
t = 0:1/fs:(N-1)/fs; %дискретное время
fi = fc - fh; %вычисляем промежуточную частоту
fi = fi + .42e6;
 
S_h = IQ.*exp(-2*1i*pi*fi*t); %перенос на нулевую частоту
 
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%Децимация частоты(понижение частоты дискретизации в 10 раза)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
S_hh = decimate(S_h, 10, 'fir'); %децимация сигнала S_hh  в 10 раз
%была 51 000 000(51МГц) стала 5 100 000(5.1МГц)
 
A(1, 1:4)=1; %создание массива А заполненного 9-ью единицами
B(1, 1:5) = 1; %создание массива В заполненного 10 единицами
J(1, 1:4)=-1; %создание массива J заполненного 9-ью нулями
G(1, 1:5) = -1; %создание массива G заполненного 10 нулями
 
%Считаем на сколько отсчетов нужно будет расширять 
%каждый элемент М-последовательности 
for k=1:1:1023
    x(1) = fs_fcod;
    x(2) = abs(x(1)-fix(x(1))); %считаем дробную часть
    x(2*k+1) = x(1) + x(2*k);
    x(2*k+2) = abs(x(2*k+1) - fix(x(2*k+1)));
end
 
%Создаем новый массив данных "у" элементами которого
%являются значения массива "х" на нечетных местах   
   d = 1;
   for z=1:2:length(x) %пробегаем по нечетным позициям
       y(d)= x(z); %записываем в новый массив
       d = d + 1;
   end
 
%Создание расширенной G-последовательности на 1 мс должно быть 5100 символов   
  G_expanded = []; %создаем пустой массив
for q=1:1:1023
    if (cod_bin(1,q) == 1) && (fix(y(1,q)) == 4) 
         G_expanded = [G_expanded, A];
    elseif (cod_bin(1,q) == 1) && (fix(y(1,q)) == 5)
         G_expanded = [G_expanded, B];
    elseif (cod_bin(1,q) == 0) && (fix(y(1,q)) == 4) 
         G_expanded = [G_expanded, J];
        else
         G_expanded = [G_expanded, G];
    end  
end
 
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% ПРИБЛИЗИТЕЛЬНЫЙ ПОИСК ДОПЛЕРОВСКОГО СДВИГА
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs1=5.1e6; %новая частота дискретизации после децимации
 
t1 = 0:1/fs1:5099*1/fs1; %новая временная сетка
Sv_sum = zeros(21,5100);
Sv_col = zeros(1,5100);
for l=-4000:400:4000
f_dopl_signal = exp(-2*1i*pi*l*t1); %генерируем сигнал на частоте Доплера
    for l2=1:1:collect_number
           
        l1=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
        X(l2,:)= S_hh(1+5100*l1(l2):5100*l1(l2+1)).*f_dopl_signal;
        F1 = fft(G_expanded);
        Kf = conj(F1);
        F2 = fft(X(l2,:));
        Fv = F2.*Kf;
        Sv = abs(ifft(Fv));
        Sv_col = Sv_col + Sv;
    end
    Sv_sum((l/400)+11,:) = Sv_col;
    Sv_col=0;
end
mesh(Sv_sum);
SNR = 20*log10((max(abs(fft(Sv_sum))))/std(Sv_sum))
Я сначала обрадовался получил значение в 45 дБ, но потом когда посмотрел соотношение спутника где нет пика, а сплошной шум, он мне выдал точно такое же значение. В чем косяк формулы?

как в числителе должно быть я допер
(max(max(abs(fft(Sv_sum))))) это максимум, НО как из стд выкинуть номер этого отсчета(занулить его)????
0
Миниатюры
Как найти соотношение сигнал-шум  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2016, 10:33
Ответы с готовыми решениями:

Найти отношение сигнал/шум аудиосигнала несколькими способами
Здравствуйте, нужно найти сигнал\шум аудиосигнала несколькими способами. Подскажите, пожалуйта,...

Как наложить белый шум на случайный сигнал
я задаю случайный сигнал через rand(0,480), так как сигнал мне нужен от 0 до 0.5, то умножаю его на...

Определение по спектру отношения сигнал/шум
Всем здрасти! Необходимо определить по спектру ориентировочное соотношение сигнал/шум (snr)! ...

Построение теоретической зависимости вероятности ошибки от отношения сигнал/шум
Добрый день! Помогите, пожалуйста, построить теоретическую зависимость (на рисунке выделено желтым...

7
444 / 357 / 36
Регистрация: 17.07.2013
Сообщений: 1,939
20.10.2016, 13:36 2
Цитата Сообщение от nickolaspicko Посмотреть сообщение
это отношение маскимума графика к СКО шумовой полки
маскимума графика ???
шумовой полки ???

Отношение сигнал/шум
https://ru.wikipedia.org/wiki/... 1%83%D0%BC
0
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
20.10.2016, 14:33 3
Лучший ответ Сообщение было отмечено nickolaspicko как решение

Решение

Судя по картинке спектра (если это спектр) Энергия сигнала сосредоточена не в одном отсчёте.
Если это всего лишь косяки БПФ, то то что Вы хотите можно выразить так:
S=abs(fft(Sv_sum)) - Спектр сигнала (только энергия)
SValue=max(max(S)) - Уровень сигнала
Sadr=find(S==SValue) - адрес максимума в массиве
S(Sadr)=0 - зануление этого значения (как и спрашивали)

Если (и скорее всего) соседние отсчёты от максимума так же нельзя отнести к шуму то можно так:
Sadr=find(S>=0,5*SValue) - все адреса значений спектра, которые выше заданного порога 0,5
S(Sadr)=0 - зануление их

Честно говоря я не знаю в точности что следует считать сигналом а что шумом.
Я бы начал с того, что отнёс бы к сигналу ту часть спектра, которая соответствует заявленному диапазону частот сигнала, а всё остальное, соответственно отнёс бы к шуму.
Кроме того, я честно говоря думал раньше что это отношение амплитуды сигнала (здесь SValue) к средней амплитуде шума (mean от значений спектра с исключёнными отсчётами соответствующими сигналу).
В этом случае занулять их тоже не совсем честно, можно их исключить:
S(Sadr)=[];
N=mean(mean(S)); - среднее
StoN=S/N - С/Ш

но зачем нужно СКО "шумовой полки"?
1
3 / 2 / 1
Регистрация: 23.08.2016
Сообщений: 38
21.10.2016, 10:38  [ТС] 4
Алексей89, спасибо! Мне мой ментор сказал, что в данном случае сигнал-шум ищется, как отношение max(самая верхняя точка) к СКО(функция std) шумовой полки(все что на уровне 5*10^4) с исключенным значением максимума оттуда!
0
444 / 357 / 36
Регистрация: 17.07.2013
Сообщений: 1,939
21.10.2016, 20:10 5
Цитата Сообщение от nickolaspicko Посмотреть сообщение
в данном случае сигнал-шум ищется
Какой в этом смысл? Какие аргументы? Что уникального "в данном случае"?
0
3 / 2 / 1
Регистрация: 23.08.2016
Сообщений: 38
27.10.2016, 11:34  [ТС] 6
Правильное решение, мало ли кому интересно будет:
Matlab M
1
2
3
4
[row_max, col_max] = find( Sv_sum == max( max(Sv_sum))); %поиск в матрице координаты максимума
Sv_sum(row_max,col_max)=0; %зануляем максимум
N_s = mean(Sv_sum(row_max,:)); %ищем среднеее значение максимальной строчки с зануленным максимумв ней
SNR = 30+20*log10(max( max(Sv_sum))/N_s); %ищем сигнал-шум
0
34 / 34 / 4
Регистрация: 19.02.2013
Сообщений: 118
27.10.2016, 11:39 7
max( max(Sv_sum))
так тыж его занулил
2
3 / 2 / 1
Регистрация: 23.08.2016
Сообщений: 38
27.10.2016, 11:56  [ТС] 8
Алексей89, спасибо поправил

Matlab M
1
2
3
4
5
A_s = max(max(Sv_sum)); %ищем максимум в матрице 
[row_max, col_max] = find( Sv_sum == A_s); %поиск в матрице координаты максимума
Sv_sum(row_max,col_max)=0; %зануляем максимум
N_s = mean(Sv_sum(row_max,:)); %ищем среднеее значение максимальной строчки с зануленным максимумом в ней
SNR = 30+20*log10(A_s/N_s); %ищем сигнал-шум
Добавлено через 1 минуту
Алексей89, но кстати я посмотрел прогу свою и исправленный вариант. Было 39.8, а стало 39.95, ка бы разницы почти нет, но порядок действий теперь определенно верный! Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2016, 11:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

На сигнал наложить шум и пропустить все через фильтр Калмана
на сигнал sin(x) наложить шум, и пропустить это все через фильтр Калмана как реализовать все...

Определить соотношение сигнал/шум (Дб) для нормированного в пределах от 0 до 1 сигнала видеоизображения
Здравствуйте! Нужно определить соотношение сигнал/шум (Дб) для нормированного в пределах от 0...

ОУ сигнал/шум
Добрый день! Начал изучать операционные усилители (LM324). Хочу сделать усилитель для...

DSSS, отношение сигнал/шум
Пытаюсь разобраться в расширении спектра методом прямой последовательности. В паре источников нашёл...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.