3. Спектральный анализ / Лабораторная 3. Спектральный анализ. Агеев
.docxМИНОБРНАУКИ
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Челябинский государственный университет»
(ФГБОУ ВО «ЧелГУ»)
Кафедра радиофизики и электроники
Лабораторная работа №3
«Спектральный анализ сигналов»
-
Выполнил:
студент группы ФФ-404
Агеев А.А.
Проверил:
Доцент, Старший научный сотрудник
Павлухина О.О.
Челябинск, 2025 г.
Задание:
Построение амплитудных и фазовых спектров. «Фурье анализ простых радиофизических сигналов».
Из первой лабораторной работы использовать сигналы и построить для них АЧХ и ФЧХ.
Сигналы:
sin x
cos x
sigma
delta
радиоимпульс
случайный сигнал
последовательность прямоугольных импульсов
#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;
}
Sin_A:
Cоmposite Garmonic Signal:
PWM:
Random_signal:
Sin_random:
Pwm_random:
