Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3. Спектральный анализ / Лабораторная 3. Спектральный анализ. Агеев

.docx
Скачиваний:
0
Добавлен:
16.12.2025
Размер:
101.27 Кб
Скачать

МИНОБРНАУКИ

Федеральное государственное бюджетное

образовательное учреждение высшего образования

«Челябинский государственный университет»

(ФГБОУ ВО «ЧелГУ»)

Кафедра радиофизики и электроники

Лабораторная работа №3

«Спектральный анализ сигналов»

Выполнил:

студент группы ФФ-404

Агеев А.А.

Проверил:

Доцент, Старший научный сотрудник

Павлухина О.О.

Челябинск, 2025 г.

Задание:

Построение амплитудных и фазовых спектров. «Фурье анализ простых радиофизических сигналов».

Из первой лабораторной работы использовать сигналы и построить для них АЧХ и ФЧХ.

Сигналы:

  1. sin x

  2. cos x

  3. sigma

  4. delta

  5. радиоимпульс

  6. случайный сигнал

  7. последовательность прямоугольных импульсов

#include <iostream>

#include <cmath>

#include <fstream>

using namespace std;

#ifndef M_PI

#define M_PI 3.14159265358979323846

#endif

const double _2pi = 2.0 * M_PI; // 6.283185307179586

void Gen_PWM(double* s, int N) {

double A, D;

cout << "A=";

cin >> A;

cout << "D=";

cin >> D;

int t = static_cast<int>((D / 100.0) * N);

for (int n = 0; n < N; n++) {

s[n] = (n < t) ? A : 0;

}

ofstream out("PWM.dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void Gen_CompositeHarmonicSignal(double* s, int N) {

for (int n = 0; n < N; n++) {

double x = _2pi * n / N;

s[n] = 100 + 10 * cos(1 * x)

+ 20 * sin(2 * x)

- 30 * cos(3 * x)

- 40 * sin(4 * x)

+ 50 * cos(5 * x) + 50 * sin(5 * x)

- 60 * cos(6 * x) + 60 * sin(6 * x)

- 70 * cos(7 * x) - 70 * sin(7 * x)

+ 80 * cos(8 * x) - 80 * sin(8 * x);

}

ofstream out("CompositeHarmonicSignal.dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void Gen_A_sin_kw(double* s, int N) {

double A, k;

cout << "A*sin(k*w)\nA=";

cin >> A;

cout << "k=";

cin >> k;

for (int n = 0; n < N; n++) {

s[n] = A * sin(k * _2pi * n / N);

}

ofstream out("Asin(kw).dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void Gen_random(double* s, int N) {

for (int n = 0; n < N; n++) {

s[n] = rand() % 100 - 50;

}

ofstream out("Random.dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void Gen_sin_random(double* s, int N) {

double A, k, G;

cout << "A*sin(k*w)\nA=";

cin >> A;

cout << "k=";

cin >> k;

cout << "+G*A*sum\nG=";

cin >> G;

for (int n = 0; n < N; n++) {

double shum = ((rand() % 200) - 100) / 100.0;

s[n] = A * sin(k * _2pi * n / N) + G * A * shum;

}

ofstream out("sin_random.dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void Gen_pwm_random(double* s, int N) {

double A, D, G;

cout << "A=";

cin >> A;

cout << "D=";

cin >> D;

cout << "+G*A*sum\nG=";

cin >> G;

int t = static_cast<int>((D / 100.0) * N);

for (int n = 0; n < N; n++) {

double shum = ((rand() % 200) - 100) / 100.0;

s[n] = (n < t) ? (A + G * A * shum) : (G * A * shum);

}

ofstream out("PWM_random.dat");

for (int n = 0; n < N; n++) {

out << n << ", " << s[n] << "\n";

}

}

void FourierTransform(double* s, int N, double* C, double* fi, int K) {

double E = 0;

for (int n = 0; n < N; n++) {

E += fabs(s[n]);

}

double e = E / 100000.0;

for (int k = 0; k < K; k++) {

double A_k = 0, B_k = 0;

for (int n = 0; n < N; n++) {

double angle = k * _2pi * n / N;

A_k += s[n] * cos(angle);

B_k += s[n] * sin(angle);

}

A_k = (fabs(A_k) > e) ? (2.0 * A_k / N) : 0;

B_k = (fabs(B_k) > e) ? (2.0 * B_k / N) : 0;

C[k] = sqrt(A_k * A_k + B_k * B_k);

if (C[k] > e) {

if (fabs(A_k) < 1e-10) {

fi[k] = (B_k > 0) ? 90.0 : -90.0;

}

else {

double atg = atan2(B_k, A_k);

fi[k] = (180.0 / M_PI) * atg; // Теперь M_PI определен

if (fi[k] < 0) fi[k] += 360.0;

}

}

else {

fi[k] = 0;

}

}

C[0] /= 2.0;

ofstream out1("C_k.dat");

ofstream out2("fi_k.dat");

for (int k = 0; k < K; k++) {

out1 << k << ", " << C[k] << "\n";

out2 << k << ", " << fi[k] << "\n";

}

}

int main() {

int N;

cout << "N=";

cin >> N;

double* S = new double[N];

int K = 100;

double* C = new double[K];

double* fi = new double[K];

// Выберите один из генераторов сигналов:

Gen_A_sin_kw(S, N);

//Gen_CompositeHarmonicSignal(S, N);

//Gen_PWM(S, N);

//Gen_random(S, N);

//Gen_sin_random(S, N);

//Gen_pwm_random(S, N);

FourierTransform(S, N, C, fi, K);

delete[] S;

delete[] C;

delete[] fi;

return 0;

}

  1. Sin_A:

  1. Cоmposite Garmonic Signal:

  1. PWM:

  1. Random_signal:

  1. Sin_random:

  1. Pwm_random:

Соседние файлы в папке 3. Спектральный анализ