LABA3_PROG
.docxФедеральное агентство связи
ордена Трудового Красного Знамени
Федеральное государственное
бюджетное образовательное учреждение высшего образования Московский технический университет связи и информатики
Лабораторная работа №3
«Функции, запись бинарных файлов»
Выполнил:
студент группы БРТ2102
Епифанов Георгий
Проверил:
Кандауров Николай
Москва 2023
Задание:
Для каждого простого сигнала из лабораторной работы №2 написать функцию, которая будет возвращать объект std::vector с отсчетами сигнала. Создать std::vector и объединить в нем четыре простых сигнала. Записать данный вектор в бинарный файл формата. adc Открыть файл в имитационной среде Спектр-2 и построить осциллограмму.
Дано:
CONST GTI COS PILA
CONST : A = 3.12;
GTI : T = 12 отсчетов; Ширина 6 отсчетов;
COS : A = 1; f = 10 900 Гц; Fs = 48 кГц;
A*cos(2*pi*f*i/Fs)
PILA : A = 1; T = 12 отсчетов;
Листинг программы:
struct ADCFILEHEADER
{
double dt; //!< Период дискретизации в секундах
unsigned long h; //!< Разрядность АЦП
unsigned long fN; //!< Общее количество отсчетов в файле
float Am; //!< Амплитуда, соответствующая максимальному значению целочисленного отсчета
unsigned long flags; //!< Флаги
char reserv[8]; //!< Резерв
};
typedef struct ADCFILEHEADER* LPADCFILEHEADER; //!< Указатель на ADCFILEHEADER
#define ADCF_DATA_INTEGER 0x00000000 //!< Тип данных - целочисленные
#define ADCF_DATA_FLOAT 0x00000001 //!< Тип данных - float
#define ADCF_TYPE_REAL 0x00000000 //!< Тип отсчетов - действительные
#define ADCF_TYPE_COMPLEX 0x00000002 //!< Тип отсчетов – комплексные
#define _USE_MATH_DEFINES
// из теории
#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
using namespace std;
bool write_adc(std::vector<float> MASS_DATA, double FREQ_SAMPLING)
{
ADCFILEHEADER head;
head.Am = 1.0;
head.h = 32;
head.dt = 1.0 / FREQ_SAMPLING;
head.fN = MASS_DATA.size();
head.flags = ADCF_DATA_FLOAT;
const char* FName = "H:\\XFILE.adc"; //Путь к файлу
float im = 0.0;
/*РАБОТА С БИНАРНЫМ ФАЙЛОМ*/
ofstream out(FName, ios::binary); //Ставим режим "бинарный файл"
out.write((char*)&head, sizeof(head)); //Записываем в файл структуру заголовка
for (int i = 0; i < MASS_DATA.size(); ++i)
{
out.write((char*)&MASS_DATA[i], sizeof(MASS_DATA[i])); // Записываем действительные отсчет
}
out.close();
return true;
//из теории
}
vector<float> CCONST() // 1) CONST
{
vector<float> MASS_DATA(64);
double A = 3.14;
for (int i = 0; i < 64; i++)
{
MASS_DATA[i] = A;
}
return MASS_DATA;
}
/*
vector<float> GGTI(int T) // 2) GTI
{
vector<float> MASS_DATA(64);
for (int i = 0; i < 64; i++)
{
if (/*i % K % 15 < N % 16(i + 1) % T == 0)
{
MASS_DATA[i] = 1;
}
else
{
MASS_DATA[i] = 0;
}
}
return MASS_DATA;
}
*/
vector<float> GGTI(int T) // 2) GTI
{
vector<float> MASS_DATA(64);
for (int i = 0; i < 64; i++)
{
if (i % T == 0)
{
MASS_DATA[i] = 1;
}
else
{
MASS_DATA[i] = 0;
}
}
return MASS_DATA;
}
vector<float> СCOS(int N) // 3) КОСИНУС COS
{
vector<float> MASS_DATA(64);
double COS_FREQ = 12000 - 50 * N;
double FREQ_SAMPLING = 48000;
for (int i = 0; i < 64; i++)
{
MASS_DATA[i] = cos(float(2 * M_PI * i * COS_FREQ / FREQ_SAMPLING));
}
return MASS_DATA;
}
vector<float> PPILA(int N) // 4) PILA
{
vector<float> MASS_DATA(64);
double pila = N % 63;
for (int i = 0; i < 64; i++)
{
MASS_DATA[i] = (i % int(pila + 1)) / pila;
}
return MASS_DATA;
}
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Перейдите в текстовый документ XFILE!\n";
const int N = 22; //последние цифры студенческого
const int K = 6; // номер в группe
double FREQ_SAMPLING = 48000.0;
double COS_FREQ = 10900;
float A = 3.12;
int T = 12;
vector<float> constanta = CCONST();
vector<float> gti = GGTI(T);
vector<float> cos = СCOS(N);
vector<float> pila = PPILA(N);
vector<float> MASS_SIGNAL(256);
for (int i = 0; i < 64; i++)
{
MASS_SIGNAL[i] = constanta[i];
MASS_SIGNAL[64 + i] = gti[i];
MASS_SIGNAL[64 * 2 + i] = cos[i];
MASS_SIGNAL[64 * 3 + i] = pila[i];
}
write_adc(MASS_SIGNAL, FREQ_SAMPLING);}
Р езультат: