Форум программистов, компьютерный форум, киберфорум
Наши страницы
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
ShawnNik
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 6
1

Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

01.04.2018, 21:11. Просмотров 99. Ответов 1
Метки нет (Все метки)

Здравствуйте. Подскажите, с чем связано наблюдаемое мной явление, когда при разном шаге между компонентами сигнала после обработки данных во временной области получаются то верные, то неверные значения амплитуд компонент сигнала на спектре. Сгенерировал два тестовых сигнала. В первом сигнале компоненты формировались с шагом 2,5 Гц, во втором сигнале с шагом 2,4 Гц. Общими параметрами были:
а) Амплитуда составляющих = 7.
Б) Частота дискретизации = 640 Гц.
В) Количество точек во временной области = 5555.
Г) Первая компонента имеет частоту = 15.3125 Гц.
Д) Последняя компонента имеет частоту <= 120.3125 Гц.
Е) Оконная функция – окно Хэмминга.
В результате, обработав первый сигнал, был получен рисунок №1, второй сигнал – рисунок №2.
Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

В результате после обработки верные значения амплитуд компонент на спектре получены только для первого сигнала, а на спектре второго сигнала присутствуют искажения значения амплитуд компонент.
Попробовал сформировать ещё несколько сигналов с шагом между компонентами больше 2,5 Гц и меньше 2.4 Гц. В результате верные результаты на спектрах получаются только, если сигнал состоит из компонент, отстоящих друг от друга >= на 2,5 Гц, если шаг <= 2.4 Гц, то значения амплитуд на спектрах неверные.
Ещё несколько сигналов для примера (менялся только шаг между компонентами и количество точек во временной области):
а) Шаг = 2,4 Гц, количество точек во временной области = 131072.
Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

б) Шаг = 3,75 Гц, количество точек во временной области = 5555.
Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

в) Шаг = 1 Гц, количество точек во временной области = 5555.
Наличие искажения амплитуд гармоник в спектре сигнала после ДПФ в зависимости от шага между ними

Сигналы формировал с помощью следующего кода:
C#
1
2
3
4
5
6
7
8
for (int i = 0; i < 8192; i++)
            {
                values.Add(0.0);
                for (double freq = 15.3125; freq < 120.3125; freq += 2.4)
                {
                    values[i] += 7.0 * Math.Sin(2 * Math.PI * freq * i * 0.0015625);
                }
            }
Код обработки сигнала:
C#
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
private void AddingNull(List<double> preMeasurementValues)
        {
            bool result = false;
            int[] values =
            {
                2,
                4,
                8,
                16,
                32,
                64,
                128,
                256,
                512,
                1024,
                2048,
                4096,
                8192,
                16384,
                32768,
                65536,
                131072,
                262144,
                524288,
                1048576,
                2097152,
                4194304,
                8388608,
                16777216,
                33554432,
                67108864,
                134217728,
                268435456,
                536870912,
                1073741824
            };
            int countPreMeasurementValues = preMeasurementValues.Count;
            for (int i = 0; i < values.Length; i++)
            {
                int raznicza = countPreMeasurementValues - values[i];
                if (raznicza == 0)
                {
                    result = true;
                    break;
                }
                if (raznicza < 0)
                {
                    for (int j = 0; j < -raznicza; j++)
                    {
                        //sampleArray.Add(0.0);
                        preMeasurementValues.Add(0.0);
                    }
                    result = true;
                    break;
                }
            }
            if (result == false)
                throw new Exception("Количество измеренных значений больше, чем предусмотрено для обработки.");
        }
                
        private double[] Hamming(int countWmeasurementValues, out double b)
        {
            double[] pointsWindow = new double[countWmeasurementValues];
            int Ndecressed = countWmeasurementValues - 1;
            double doublePI = 2 * Math.PI;
            b = 0.0;
            for (int n = 0; n < countWmeasurementValues; n++)
            {
                pointsWindow[n] = 0.54 - 0.46 * Math.Cos(doublePI * n / Ndecressed);
                b += pointsWindow[n];
            }
            b /= countWmeasurementValues;
            return pointsWindow;
        }
        
        public Complex[] Run(List<double> preMeasurementValues)
        {
            double b;
            double[] pointsWindow = Hamming(preMeasurementValues.Count, out b);
            for (int n = 0; n < preMeasurementValues.Count; n++)
            {
                preMeasurementValues[n] *= pointsWindow[n];
            }
            
            AddingNull(preMeasurementValues);
            
            Complex[] sampleArray = new Complex[preMeasurementValues.Count];
            
            for (int i = 0; i < preMeasurementValues.Count; i++)
            {
                Complex complexSum = new Complex();
                for (int j = 0; j < preMeasurementValues.Count; j++)
                {
                    double argument = 2 * Math.PI * j * i / preMeasurementValues.Count;
                    double real = preMeasurementValues[j] * (Math.Cos(argument));
                    double imaginary = preMeasurementValues[j] * (Math.Sin(argument));
                    Complex complex = new Complex(real, imaginary);
                    complexSum += complex;
                }
                
                sampleArray[i] = complexSum;
            }
            
            for (int m = 0; m < sampleArray.Length; m++)
            {
                sampleArray[m] /= b;
            }
            
            return sampleArray;
        }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2018, 21:11
Ответы с готовыми решениями:

Разница между амплитудой независимых частот в спектре фурье и спектральной мощностью сигнала
Здравствуйте ! Может кто-нибудь понятно объяснить. В ЦОС часто используется...

Выделение гармоник из сигнала
Подскажите как построить фильтры для выделения каждой из трех гармоник,...

Определение частоты сигнала из ДПФ
День добрый! В задаче определения частоты по отклонению фазы изображающего...

В зависимости от порядкового номера цвета в спектре (1,2 ... 7 ) вывести его название
Оператор switch Написать программу , которая в зависимости от порядкового...

Как изменятся результаты ДПФ при увеличении длины дискретного сигнала?
Добрый день! Возникла такая задача: Длину дискретного сигнала увеличили в два...

1
ShawnNik
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 6
01.04.2018, 23:36  [ТС] 2
Попробовал использовать сайт с расчётом спектра заданного сигнала (задавал исходные данные от первого и второго рисунка), получил те же спектры, что и у меня. Тоже присутствует утечка спектра, хотя её почти не должно быть после окна Хэмминга. В чём же дело?

Добавлено через 2 часа 7 минут
Убрал пару опечаток, не влияющих на результат (лишние скобки и добавлен "-"перед Math.Sin).
C#
1
double real = preMeasurementValues[j] * Math.Cos(argument);
C#
1
double imaginary = preMeasurementValues[j] * -Math.Sin(argument);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2018, 23:36

Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили пе
Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S...

Изменение имен переменных в зависимости от шага цикла
Всем привет. Помогите, если такое возможно, как изменять имена переменных в...

Вычислить определенный интеграл методом Симпсона Построить график зависимости |I-It| от шага интегрирования h
Вычислить определенный интеграл методом Симпсона и построить график ...


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

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

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