Міністерство освіти та науки України
Лабораторна робота№
«Обробка цифрових сигналів»
Мета роботи: здійснити демодуляцію амплітудно_модульованого сигналу заданого послідовністю цифрових відліків.
Теоретичні відомості
Обробка модульованих сигналів займає важливе значення в сучасній техніці. Суть модуляції – перенесення низькочастотної інформаційної складової в більш високочастотну (ВЧ) область спектру. В радіотехніці перенос в ВЧ –область дозволяє здійснити випромінювання сигналу в навколішній простір, в приладобудуванні – здійснити підсилення наднизькочастотних коливань за схемою “модулятор/демодулятор” (МДМ), в телефонії – по двопровідній лінії звґязку передати на різних модуляційних несучих частотах декілька різних розмов.
Для побудови дешевих інформаційно-вимірювальних систем спостереження на базі ЕОМ зручно використовувати поширені плати АЦП призначені для запису та відтворення аудіосигналів (т.зв. “звукові карти”). Особливістю їх функціонування є обмежений частотний діапазон, як правило 15 Гц…22 кГц, де верхня частота обмежена частотою дискретизації АЦП (може задаватись з ряду 8, 22, 32, 44.1, 48, та 96 кГц в залежності від можливостей конкретної звукової плати). Розрядність плат – 16, 20, 24. Останні дві – зустрічаються рідко в дорогих екземплярах плат. При необхідності вимірювання наднизькочастотних сигналів за допомогою ЕОМ (тиск в трубопроводах, темпаратура, навантаження) з частотним діапазоном 0…1 Гц., можна скористатися звуковою платою. Максимальна похибка таких вимірювальних систем –менша 1% на всьому проміжку часу, а похибка зміни сигналу протягом інтервалу часу 5 хв. не перевищує 0.05%. Вхідний діапазон сигналу по напрузі для звукових плат складає від 0 до 1…4 В по амплітуді в залежності від конкретної моделі звукової плати. Власний шум АЦП, як заслідчують експериментальні дослідження складає 2..3 двійкові розряди. Тому при наявності фактично 13 – 15 розрядного АЦП (8192…32768 градацій вхідного сигналу) можна забезпечити точні відносні вимірювання без підстроювання вхідного діапазону для кожного типу вимірювального обґєкта.
Завдання
За допомогою довільно вибраного програмного середовища (MathCAD, MathLab, Borland++ Builder, Delphi, Basic, Pascal, C, Fortran) написати програму_демодулятор файлів “AM_testХ.txt”. (де Х-№ файлу)
Програма повинна формувати вихідний файл, в якому записана огинаюча зміни амплітуди вхідного сигналу.
Програма повинна ігнорувати перехідні процеси (паразитні коливання амплітуди одного імпульсу )
Програма повинна графічно відтворювати результат демодуляції на екрані.
Виконання роботи
Програма мовою С.
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <bios.h>
#include <math.h>
#define true 1
#define false 0
float x4[640];
void grafik()
{
int j,i,r=0,gmode,gdriver=DETECT;
double k;
char qwe[20];
initgraph (&gdriver,&gmode,"\BGI");
setcolor (BLUE);
for(i=0;i<6;i++,r+=80)
{
line(0,r,640,r);
}
for(i=0,r=0;i<8;i++,r+=80)
{
line(r,0,r,480);
}
setcolor (RED);
line (0,0,0,479);
line (1,0,1,479);
line (0,479,639,479);
line (0,478,639,478);
setcolor (WHITE);
for (i=0;i<640;i++)
{
line (i,400-x4[i]*240/10000,i+1,400-x4[i+1]*240/10000);
}
setcolor (WHITE);
outtextxy (7,15,"y(t)");
outtextxy (620,470,"t");
bioskey(0);
closegraph();
return;
}
void main(int argc, char *argv[])
{
register int a,i;
char buff[20]="AM_test.txt";
float b[3],c;
int max;
FILE *f1,*f2;
if(argc>1)for(i=0;(buff[i]=*(argv[1]+i))!=0;i++);
if(!(f1=fopen(buff,"r+")))return;
for(i=0;buff[i]!='.';i++);
strcpy(&buff[i],"1.txt");
f2=fopen(buff,"w+");
a=0;i=1;
do
{
fgets(buff,20,f1);
if(feof(f1)) break;
b[0]=atof(buff);
do
{
max=false;
do
{
fgets(buff,20,f1);
if(feof(f1)) break;
b[1]=atof(buff);
if( ( c=fabs(b[0])-fabs(b[1]) )>0 )
{
max=true;
c*=0.1;
}
else b[0]=b[1];
}
while(!max);
if(feof(f1)) break;
do
{
fgets(buff,20,f1);
if(feof(f1)) break;
b[2]=atof(buff);
if( fabs(b[1]-b[2]) < c )
{
b[2]=fabs(b[2]);
x4[a++]=b[2];
fprintf(f2,"%.0f\n",b[2]);
break;
}
}
while(max);
do
{
fgets(buff,20,f1);
if(feof(f1)) break;
b[1]=atof(buff);
if( (b[0]>0)&&(b[1]<0) )max=false;
if( (b[0]<0)&&(b[1]>0) )max=false;
}
while(max);
}
while( !feof(f1)&&( a<640 ) );
if(feof(f1)){for(;a<641;a++)x4[a]=0;grafik();break;}
else
{
a=0;
grafik();
}
}
while(i);
}
Програма мовою ASSEMBLER для визначення максимума.
DOSSEG
.model small
.stack 100h
.data
message db "Програма визначення максимуму.",0dh,0ah,'$'
message_1 db "Будь-ласка натиснiть <enter> для запуску чи <esc> для виходу",0dh,0ah,'$'
message_2 db "Зачекайте будь-ласка. Програма обробляє данi!.....",0dh,0ah,'$'
message_3 db "Максимальне число по модулю = ",'$'
open_file db 'AM_test.txt',0
reg_si dw 0
buffer_3 db 8 dup(0)
buffer_2 db 8 dup(0)
buffer_1 label byte
.code
start:
mov ax,@data
mov ds,ax
mov ah,09h
mov dx,offset message
int 21h
mov dx,offset message_1
int 21h
dec ah
no_enter:
int 21h
cmp al,1bh
jnz cmp_enter
jmp exit_program
cmp_enter:
cmp al,0dh
jnz no_enter
mov ah,09h
mov dx,offset message_2
int 21h
mov ax,3d80h
xor cl,cl
mov dx,offset open_file
int 21h
mov bx,ax
xor si,si
next_letter:
mov ah,3fh
mov cx,0001h
mov dx,offset buffer_1
int 21h
dec ax
js end_file
mov al,buffer_1
cmp al,'-'
jz next_letter
cmp al,0dh
jz next_word
cmp al,0ah
jz next_word
mov byte ptr[buffer_2+si],al
inc si
jmp next_letter
next_word:
cmp si,reg_si
jz cmp_max_number
jnc change_max_1
max_no_change:
xor si,si
jmp next_letter
cmp_max_number:
mov reg_si,si
xor si,si
mov cx,reg_si
next_charter:
mov al,byte ptr[buffer_2+si]
cmp byte ptr[buffer_3+si],al
jc change_max
jnc max_no_change
inc si
loop next_charter
jmp change_max
change_max_1:
mov reg_si,si
change_max:
xor si,si
mov cx,reg_si
next_charter_1:
mov al,byte ptr[buffer_2+si]
mov byte ptr[buffer_3+si],al
inc si
loop next_charter_1
xor si,si
jmp next_letter
end_file:
mov ah,09h
mov dx,offset message_3
int 21h
xor si,si
mov cx,reg_si
mov ah,02h
next_charter_2:
mov dl,byte ptr[buffer_3+si]
int 21h
inc si
loop next_charter_2
mov ah,08h
int 21h
exit_program:
mov ah,4ch
int 21h
end start
Висновок: розроблено прогаму мовою С для побудови графіку з даних, записаних у файлі та програму мовю assembler для знаходження максимуму.