МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЗІ
Розрахункова робота
на тему:
«Розробка цифрового диктофону»
з курсу «Системи запису і відтворення інформації»
Варіант № 6
Львів – 2015
Мета роботи – отримати навики проектування та розрахунку основних вузлів цифрових пристроїв для запису і відтворення інформації з використанням сучасної елементної бази.
Завдання:
Розробити принципову електричну схему цифрового диктофону згідно завдання та навести усі необхідні розрахунки.
Скласти специфікацію елементів схеми.
Навести всі необхідні розрахунки.
Навести АЧХ розрахованого мікрофонного підсилювача + фільтра.
Написати на мові MatLab або C функції запису файлу у MMC/SD-карту, на якій встановлена файлова система FAT16.
Написати на мові MatLab або C функцію запису файлу у wav-форматі.
Написати на мові MatLab або C функцію стиснення аудіосигналу з потрібною степінню компресії.
Завдання варіанту
Варіант
Тип джерела живлення
Частота дискретизації, Гц
Степінь стиску
Час запису без стиску, годин
Тип мікрофону
Мікрофонний підсилювач + фільтр
6
LIR14500
11025
4
175
MEMS
Варіант 2
Розроблення принципової схеми цифрового диктофону
1.1 Оцінка споживаної потужності компонентів цифрового диктофону
Знаходимо необхідний об’єм NAND-Flash пам’яті:
Об’єм (Гбайт)=110253600175/1073741824=6,5 Гбайт
Отже, для побудови диктофону нам достатньо однієї мікросхеми NAND-Flash пам’яті, об’ємом 8 Гбайт.
Вибираємо мікросхему K9HCG08U5M (Samsung) з організацією 8Gb x 8.
Таблиця 1
Елементи схеми
Споживаний струм, мА
Мікроконтролер
≤ 10
MMC/SD карта пам’яті
≤ 100
Мікросхема NAND-Flash пам’яті
≤ 30
Мікрофон
≤ 1
ОП та пасивні елементи
≤ 5
Світлодіоди та органи управління
≤ 10
Кола управління живленням
≤ 5
Всього
≤ 161 мА
Отже кола живлення будуть розраховані на струм навантаження не менше 200 мА.
Вибираємо робочу напругу живлення елементів диктофону
Таблиця 2
Елементи схеми
Напруга живлення, В
Мікроконтролер
2.7-3.6
MMC/SD карта пам’яті
2.7-3.6
Мікросхема NAND-Flash пам’яті
2.7-3.6
Мікрофон
2.0-10.0
ОП
2.7-8.0
Світлодіоди
2.0
Приймаємо робочу напругу VCC = 3.3 В
Вибираємо мікросхеми для формування напруг живлення елементів схеми
Оскільки батарейка LIR забезпечує напругу в діапазоні 3,5-4,2 В, а робоча напруга схеми 3.3 В то необхідно використати мікросхему Step-Down стабілізатора. Step-Down стабілізатор буде живити цифрові кола та кола управління. Для аналогових кіл будемо використовувати LDO-стабілізатор на вихідну напругу 3.0 В.
В якості LDO-стабілізатора використаємо схему LT1790-3.0 з максимальним струмом навантаження 200 мА. При вхідній напрузі 3.3 вольта вихідна напруга такого LDO-стабілізатора рівна 3.0 В.Для Step-Down стабілізатора вибираємо схему LTC3240 . Згідно DataSheet ця мікросхема може віддавати струм ≥ 200 мА при вхідній напрузі 3.5В.
Синтез принципової схеми кіл живлення та розрахунок її параметрів
На підставі типових схем включення, наведених в DataSheet, синтезуємо принципову схему кіл живлення (Рис. 2).
/
Рис. 2. Схема принципова кіл живлення
Вхідний конденсатор служить для придушення пульсації та електромагнітних завад. Згідно DataSheet конденсатор C3 повинен бути керамічним , з ємністю не менше 1 мкФ та діелектриком типуX7R або X5R.
Вибираємо C3= 1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, X5R).
Згідно DataSheet вихідний конденсатор Step-Up стабілізатора повинен бути керамічним з ємністю від 2.2 мкФ до 10 мкФ та діелектриком типуX7R або X5R. Приймемо =4.7 мкФ (SMD-конденсатор, 0805, 10%, 25 В, X7R). Живлення аналогових кіл мікрофону та підсилювача здійснюється від напруги AVCC=3.0 B, яка формується LDO- стабілізатором DA2 . Якщо запис не ведеться, то для зменшення енергоспоживання мікросхема DA2 відключається мікроконтролером, шляхом подачі сигналу логічного нуля на вивід MICEN.
В якості вхідного конденсатора рекомендований керамічний з ємністю 1 мкФ. Приймаємо C4=1 мкФ (SMD- конденсатор , 0805, 10%, 10 В, X7R) . Та C5=1 мкФ (SMD- конденсатор , 0805, 10%, 10 В, X7R).
Синтез схеми мікрофонного підсилювача та фільтра
Визначаємо необхідний коефіцієнт підсилення схеми. Для цього приймемо, що максимальний рівень звукового тиску SPL (Sound Pressure Level) становить 100 дБ. Знаходимо абсолютне значення звукового тиску:
Па
При типовій чутливості мікрофону S=-42 дБ , будемо мати напругу
В якості ОП використаємо ОП, які працюють при одно полярній напрузі, мають малі шуми, високий коефіцієнт ослаблення нестабільності живлення та споживають малу потужність: наприклад TLV2252М (Texas Instruments).
Оскільки вбудований АЦП мікроконтролера ATmega16 має діапазон перетворення від 0 до AVCC, а сигнал підсилюється відносно середнього рівня AVCC/2, то коефіцієнт підсилення:
.
Згідно технічних даних мікрофона резистор повинен бути рівний 200 Ом. Вибираємо резистор = 200 Ом (SMD- резистор, 0805, 5%, 0.125 Вт).
Подільник напруги на резисторах та формує напругу зміщення рівну AVCC/2=1.5 В.Вибираємо ==100 кОм (SMD-резистори, 0805, 5%, 0.125 Вт).
Значення ємності конденсатора згідно даних становить 100 нФ. Вибираємо конденсатор =100 нФ (SMD-конденсатор, 0805, 10%, 16 В, X7R).
Приймемо , що коефіцієнт підсилення першого каскаду рівний 47 , другого .
Коефіцієнт підсилення першого каскаду , нехай
Приймемо , тоді . Вибираємо =10 кОм (SMD- резистор, 0805, 5%, 0.125 Вт) , (SMD- резистор, 0805, 5%, 0.125 Вт).
Конденсатор - розв’язуючий , для ослаблення шумів по колам живлення. Вибираємо керамічний конденсатор =0.1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, X7R).
Визначимо частоту зрізу фільтра з теорема Котельникова:
Згідно завдання частота дискретизації становить 11025 Гц. Отже
Гц
Приймемо частоту зрізу дещо меншою, оскільки АЧХ фільтра повільно спадає. Отже Гц
Для спрощення розрахунків , покладемо . Тоді формула для розрахунку частоти зрізу запишеться :
Гц
Коефіцієнт підсилення другого каскаду становить 2 і визначається за формулою:
Тоді вибираємо = 100 кОм (SMD- резистор, 0805, 1%, 0.125 Вт). = 50 кОм (SMD- резистор, 0805, 1%, 0.125 Вт).
Звідси
Вибираємо конденсатори =330 пФ (SMD- конденсатор, 0805, 10%, 16 В, X7R).
/
Рис. 3. Схема електрична принципова мікрофонного підсилювача та фільтра
Синтез схеми підключення MMC/SD-карти до МК
Мікроконтролер ATmega16 містить вбудований SPI-інтерфейс, який можна використати для підключення до MMC/SD-карти пам’яті (Рис. 4).
Призначення виводів МК:
Вивід PB4 – #CS.
Вивід PB5 – MOSI.
Вивід PB6 – MISO.
Вивід PB7 – CLK.
Вибираємо R13-R17=51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт). В якості SD-слоту X1 вибираємо MMC/SD-слот CCM05-5507 (Рис. 5).
/
Рис. 4. Схема електрична принципова інтерфейсу з MMC/SD-картою пам’яті
/
Рис. 5. MMC/SD-слот CCM05-5507
Синтез схеми підключення MMC/SD-карти до МК
Схема підключення NAND-Flash пам’яті до МК наведена на Рис. 6. Для виводів даних І/О0-І/О7 використаємо порт С мікроконтролера, для підключення керуючих виводів – порт D.
Вибираємо R18=R19=51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
1.8 Синтез схеми органів управління та індикації та їх підключення до МК.
Для індикації наявності живлення використовується світлодіод червоного кольору LED1 підключений до виводу РВ0 мікроконтролера (Рис. 7). У випадку розряду джерела живлення нижче встановленого порогу світлодіод починає блимати. Режим запису відображається світлодіодом зеленого кольору LED2, підключеним до виводу РВ1. Запис без компресії – неперервне світіння, з компресією – блимання з частотою 1 Гц.
/
Рис. 6. Схема підключення мікросхеми NAND-Flash пам’яті
/
Рис. 7. Кола індикації диктофону
Використаємо світлодіоди з низьким споживанням струму: D1 – SML-311UT (SMD-світлодіод, 0603, IF<10 мА) та D2 – SML-311BT (SMD-світлодіод, 0603, IF<10 мА). Вибираємо R20-R21=470 Ом (SMD-резистор, 0805, 5%, 0.125 Вт).
В якості перемикача подачі живлення, включення/виключення запису та вибору режиму запису SW1 візьмемо вертикальний Push Switch типу PB-11D03 (1 А, 30 В) компанії Wealth Metal Factory Ltd
//
Рис. 8. Зовнішній вигляд та електрична схема Push Switch типу PB-11D03
/
Рис. 10.8. Схема органів управління
Вибираємо R22 =51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
Орієнтовна споживна потужність диктофону та час неперервної роботи від заданого джерела живлення.
Таблиця 3
Елементи схеми
Споживана потужність, Вт
Мікроконтролер
0.036
MMC/SD карта пам’яті
0.36
Мікросхема NAND-Flash пам’яті
0.108
Мікрофон
0.01
ОП та пасивні елементи
0.04
Світлодіоди та органи управління
0.02
Кола управління живленням
0.165
Всього
0.739 Вт
Отже, орієнтовна споживна потужність диктофону буде рівна 0.739 Вт.
Визначаємо час неперервної роботи диктофону від джерела живлення LIR14500
9год 12хв.
де С=800 мА/год – ємність батарейки типу LIR14500
Специфікації
К-ть
Позначення
Опис
Маркування
Виробник
Корпус
Номінал
Резистори
3
1
R3
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
1МОм
4
2
R4, R5
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
200 Ом
5
2
R6, R7
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
100 кОм
6
1
R8
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
230 кОм
7
1
R9
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
50 кОм
8
1
R10, R11
SMD-резистор, 0805, 1 %,
0,125 Вт
Any
Any
0805
100 кОм
9
9
R12-R18, R19, R22
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
51 кОм
10
2
R20, R21
SMD-резистор, 0805, 5 %,
0,125 Вт
Any
Any
0805
470 Ом
Конденсатори
11
2
С1,C3
SMD-конденсатор, 0805, 10%, 16B, X5R
Any
Any
0805
1 мкФ
12
1
С2
SMD-конденсатор, 0805, 10%, 25B, X7R
Any
Any
0805
4,7 мкФ
13
1
С4,C5
SMD-конденсатор, 0805, 10%, 10B, X7R
Any
Any
0805
1 мкФ
14
1
С6
SMD-конденсатор, 0805, 10%, 16B, X7R
Any
Any
0805
1 мкФ
16
2
С9,С14
SMD-конденсатор, 0805, 5%, 50B, NPO
Any
Any
0805
100 нФ
17
1
С10
SMD-конденсатор, 0805, 10%, 25B, X7R
Any
Any
0805
100 нФ
18
2
С12,С13
SMD-конденсатор, 0805, 5%, 25B, X7R
Any
Any
0805
22 пФ
Діоди
19
1
D1
Світлодіод, Red
SML-311UT
Rohm
0603
20
1
D2
Світлодіод, Blue
SML-311BT
Rohm
0603
Мікросхеми
21
1
DD1
Мікроконтролер
ATmega16L – 8A U
Atmel
44-TQFP
22
1
DD2
NAND-Flash пам’ять 8Г8біт
K9HCG08
U5M
Samsung
48-TSOP
23
1
DA1
Імпульсний стабілізатор Step-Up 3,3B
LTC-3240
Linear Technology
24
1
DA2
LDO-стабілізатор
3,0 В
LT1790-3.0
Linear Technology
SOT-23-5
25
1
DA3
Операційний підсилювач
TLV2252IDR
Texas
Instruments
SOIC-8
Решта
26
1
ZQ
SMD-кварцовий
Резонатор
8,0 Мгц, 22 пФ
Q-8.0-SMU-
22-30/50
Jauch
SMU3
8.0 МГц
27
3
SWI-SW3
Вертикальні
Slide-Switch 1P1T
SS-11G05
Wealth Metal Factory Ltd
SS-11G05
28
1
X1
MMC/SD-слот
CCM05-5507
ITT
Industries
MMC/SD
АЧХ розрахованого підсилювача + фільтра
/
Рис. 10. АЧХ мікрофонного підсилювача + фільтра
/
Лістинги програм
Програма запису файлу у MMC/SD-карту, на як й встановлена файлова система FAT16:
clear all;
% Кількість байт в секторі
BytesPerSec = 512;
% Буфер для читання/запису даних
Buffer = zeros(BytesPerSec, 1);
% 1. Переводимо карту в активний режим
s = MMC_SD_Init('F:\sd\SD_512.bin');
% 2. Прочитати 0 сектор - VBR
% Номер сектора з якого починається VBR
VBR_Addr = 0;
LBA = 0;
[Buffer, c1] = MMC_SD_Read_Sector(s, LBA);
% Перевіряємо сигнатуру VBR
if (Buffer(511) ~= hex2dec('55') | Buffer(512) ~= hex2dec('AA'))
disp('VBR FAT Error');
return;
end;
% Визначаємо кількість байт в секторі
BytesPerSec = Buffer(hex2dec('b') + 1) + 2^8 * Buffer(hex2dec('b') + 2);
z = sprintf('Кількість байт в секторі: %d', BytesPerSec);
disp(z);
% Визначаємо кількість секторів в кластері
SecPerClus = Buffer(hex2dec('d') + 1) ;
z = sprintf('Кількість секторів в кластері: %d', SecPerClus);
disp(z);
% Кількість зарезервованих секторів від початку карти
RsvdSecCnt = Buffer(hex2dec('e') + 1) + 256 * Buffer(hex2dec('f') + 1);
z = sprintf('Кількість зарезервованих секторів від початку карти: %d', RsvdSecCnt);
disp(z);
% Кількість таблиць FAT
NumFATs = Buffer(hex2dec('10') + 1);
z = sprintf('Кількість таблиць FAT: %d' , NumFATs);
disp(z);
% Кількість записів в Root Directory
RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1);
z = sprintf('Кількість записів в кореневому каталозі Root Directory: %d', RootEntCnt);
disp(z);
% Кількість секторів MMC/SD-карти (до 32 MB)
TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1);
if TotSec == 0
% MMC/SD-карта > 32 MB
TotSec = Buffer(hex2dec('20') + 1) + 256 * Buffer(hex2dec('21') + 1) + 2^16 * Buffer(hex2dec('22') + 1) + 2^24 * Buffer(hex2dec('23') + 1);
end;
z = sprintf('Загальна кількість секторів MMC/SD-карти: %d', TotSec);
disp(z);
% Розмір таблиці FAT у секторах
SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1) ;
z = sprintf('Розмір таблиці FAT у секторах: %d', SecPerFAT);
disp(z);
if (Buffer(hex2dec('36') + 1) ~= 'F' & Buffer(hex2dec('37') + 1) ~= 'A' & Buffer(hex2dec('38') + 1) ~= 'T' & Buffer(hex2dec('39') + 1) ~= '1' & Buffer(hex2dec('ЗА') + 1) ~= '6')
disp('FAT16 Error');
end;
temp = Buffer((hex2dec('36') + 1):(hex2dec('3A') + 1));
z = sprintf('Тип файлової системи: %s', char(temp));
disp(z);
% Обчислюємо номер сектору з якого починається таблиця FAT1 та FAT2
FAT_Sect1 = VBR_Addr + RsvdSecCnt;
z = sprintf('Перший сектор FAT1: %d', FAT_Sect1);
disp(z);
if (NumFATs > 1)
FAT_Sect2 = FAT_Sect1 + SecPerFAT;
z = sprintf('Перший сектор FAT2: %d', FAT_Sect2);
disp(z) ;
end;
% Обчислюємо номер сектору з якого починається кореневий каталог Root Directory
RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs;
z = sprintf('Перший сектор Root Directory: %d', RootDir_Sect);
disp(z);
% Обчислюємо кількість секторів в Root Directory
RootDir_SectCnt = RootEntCnt * 32 / BytesPerSec;
z = sprintf('Кількість секторів в Root Directory: %d', RootDir_SectCnt);
disp(z) ;
% Обчислюємо номер сектора початку області даних
Data_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs + RootDir_SectCnt;
z = sprintf('Номер сектора початку області даних: %d', Data_Sect);
disp(z);
%//////////////// Шукаємо 1-ий вільний запис в RootDirectory /////////////
ByteCnt = 1; % початк запису в байтах
Flag_Free = 0; % прапорець знаходження вільного запису в RootDirectory
for jj = 1 : RootDir_SectCnt %від 1-го до останнього сектору RootDirectory
Buffer = MMC_SD_Read_Sector(s, RootDir_Sect + jj - 1); %читає поточний сектор
for ii = 1 : BytesPerSec/32 % лічильник записів
temp = Buffer(ByteCnt); % читає перший байт
if (temp == 0 | temp == hex2dec('E5'))
z = sprintf('Вільний запис знайдено');
disp(z);
Free_Sect_RootDir = RootDir_Sect + jj - 1;
z = sprintf('Сектор вільного запису в RootDirectory: %d', Free_Sect_RootDir);
disp(z);
Free_Num_RootDir = ii;
z = sprintf('Номер вільного запису: %d', Free_Num_RootDir);
disp(z);
Flag_Free = 1;
break;
end;
ByteCnt = ByteCnt + 32; %наступний запис (1 запис--32байти)
end;
if (Flag_Free == 1) %файл знайдено
break;
end;
ByteCnt = 1;
end;
if (Flag_Free == 0)
z = sprintf('Неможливо записати файл: немає вільної памяті');
disp(z);
return; %вихід з програми
end;
%//////////////// Запишемо ім'я файлу //////////////////////
Entry = Buffer(32*(ii-1) + 1 : 32*(ii-1) + 1 +31); %вільний запис в Root Directory
Entry(1) = 'M';
Entry(2) = 'Y';
Entry(3) = 'F';
Entry(4) = 'I';
Entry(5) = 'L';
Entry(6) = 'E';
Entry(7) = '2';
Entry(8) = 32;
Entry(9) = 'T';
Entry(10) = 'X';
Entry(11) = 'T';
Entry(12) = 32;
Entry(13) = 0;
Entry(14) = 150;
Entry(15) = 313; Entry(16) = 178;
Entry(17) = 84; Entry(18) = 80;
Entry(19) = 84; Entry(20) = 80;
Entry(21) = 313; Entry(22) = 178;
Entry(23) = 10; Entry(24) = 10;
Entry(25) = 84; Entry(26) = 80;
File_DATA = [65 66 67 68 69 70 71 72 73];
Entry(29) = 9;
Entry(30) = 0;
Entry(31) = 0;
Entry(32) = 0;
File_Size = length(File_DATA);
Entry_Flag = 1; % показує чи ми вже записали номер першого кластеру
for i = 1 : ceil(File_Size / (SecPerClus * BytesPerSec)) %від 1-го до останнього кластеру файлу
%/////////////// Шукаємо вільний кластер в таблиці FAT ////////////////////
Free_ClusNum = 0; %№ вільного кластеру
Flag_Clus = 0;
for ii = 1 : SecPerFAT %всі сектори FAT
Buffer = MMC_SD_Read_Sector(s, FAT_Sect1 + ii - 1);
for jj = 1 : 2 : SecPerFAT * BytesPerSec %всі вказівники в FAT
if (Buffer(jj) + 256 * Buffer(jj + 1) == 0) %якщо кластер вільний
Flag_Clus = 1;
break;
end;
Free_ClusNum = Free_ClusNum + 1;
end;
if (Flag_Clus == 1)
break;
end;
end;
z = sprintf('1-ий вільний кластер: %d', Free_ClusNum);
disp(z);
%Записуємо значення вказівника в таблицю FAT
Buffer(jj) = 255; %останній кластер файлу
Buffer(jj + 1) = 255;
wr = MMC_SD_Write_Sector(s, FAT_Sect1 + ii - 1, Buffer); %!!!!!!!!!!!!!!!!!!!!!!!!!
if (i > 1) %якщо були попередні кластери з даними файлу
Buffer = MMC_SD_Read_Sector(s, FAT_Sect1 + Prev_Sect_FAT - 1);
Buffer(Prev_Index_FAT + 1) = fix(Free_ClusNum/256); %Free_ClusNum той, який зараз
Buffer(Prev_Index_FAT) = Free_ClusNum - 256 * Buffer(Prev_Index_FAT + 1);
wr = MMC_SD_Write_Sector(s, Buffer, FAT_Sect1 + Prev_Sect_FAT - 1); %!!!!!!!!!!!!!!!!!!!!!!!!!
end;
Prev_Sect_FAT = ii; %попередній сектор з номером вільного кластеру в FAT
Prev_Index_FAT = jj; %вказівник на попередній кластер
%///////////////////////// Записуємо файл в область даних /////////////////////
File_Sect = Data_Sect + (Free_ClusNum - 2) * SecPerClus; %сектор початку файлу в DATA Region
Buffer = zeros(BytesPerSec, 1);
if (File_Size <= BytesPerSec)
Buffer(1 : File_Size) = File_DATA;
%wr = MMC_SD_Write_Sector(s, Buffer, File_Sect - 1); %!!!!!!!!!!!!!!!!!!!!!!!!!
wr = MMC_SD_Write_Sector(s, File_Sect, Buffer); %!!!!!!!!!!!!!!!!!!!!!!!!!
else
iii = 1;
for ii = 1 : SecPerClus %ceil(File_Size / BytesPerSec)
Buffer = File_DATA(iii : ii * BytesPerSec);
wr = MMC_SD_Write_Sector(s, File_Sect, Buffer); %!!!!!!!!!!!!!!!!!!!!!!!!!
File_Sect = File_Sect + 1; %наступний сектор
iii = iii + ii * BytesPerSec; %початок наступного сектору (в File_DATA)
end;
end;
if (Entry_Flag == 1)
%Entry( hex2dec('1A') + 1 ) = Free_ClusNum; %записуємо № першого кластеру файлу в запис RootDirectory ???????
Entry(28) = fix(Free_ClusNum/256);
Entry(27) = Free_ClusNum - 256 * Entry(28);
%записуємо створений запис в RootDirectory
Buffer = MMC_SD_Read_Sector(s, Free_Sect_RootDir);
Buffer(32*(Free_Num_RootDir-1) + 1 : 32*(Free_Num_RootDir-1) + 1 +31) = Entry;
wr = MMC_SD_Write_Sector(s, Free_Sect_RootDir, Buffer); %!!!!!!!!!!!!!!!!!!!!!!!!!
end;
Entry_Flag = Entry_Flag + 1;
end;
fclose(s);
РЕЗУЛЬТАТ
MMC/SD-card Init
Кількість байт в секторі: 512
Кількість секторів в кластері: 16
Кількість зарезервованих секторів від початку карти: 4
Кількість таблиць FAT: 2
Кількість записів в кореневому каталозі Root Directory: 512
Загальна кількість секторів MMC/SD-карти: 1006359
Розмір таблиці FAT у секторах: 246
Тип файлової системи: FAT16
Перший сектор FAT1 4
Перший сектор FAT2: 250
Перший сектор Root Directory: 496
Кількість секторів в Root Directory: 32
Номер сектора початку області даних: 528
Вільний запис знайдено
Сектор вільного запису в RootDirectory: 497
Номер вільного запису: 15
1-ий вільний кластер: 61
Write Sector Number 4
Write Sector Number 1472
Write Sector Number 497
Програма запису файлу у wav-формат :
clear all;
fp=fopen('MYFILE2.txt','r');
[y,count]=fread(fp);
%потрібно задати y – масив даних, які записуємо
%відкрити файл для запису
d = fopen('F:\sd\myRecord1.wav','wb');
%заповнити поле RIFF_ID (Заголовок RIFF файлу) !!!!!!!!!
fwrite(d,hex2dec('46464952'),'int32');
%заповнити поле FILE_Length (довжина файлу без полів RIFF_ID та FILE_Length)
fwrite(d,110457,'int32');
%заповнити поле WAVE_ID (заголовок блоку інформації) !!!!!!!!!
fwrite(d,hex2dec('45564157'),'int32');
%заповнити поле FMT_ID (ідентифікатор формату) !!!!!!!!!
fwrite(d,hex2dec('20746D66'),'int32');
%заповнити поле FMT_Length (сумарний розмір в байтах полів Type, Channels, SamplesPerSec, AvgBytesPerSec, Align та BitsPerSample)
fwrite(d,16,'int32');
%заповнити поле Type (тип звукових даних (тип кодеку), 0x0001 — просто вибірки)
fwrite(d,1,'int16');
%заповнити поле Channels (число каналів)
fwrite(d,1,'int16');
%заповнити поле SamplesPerSec (частота дискретизації в герцах 11025)
fwrite(d,11025,'int32');
%заповнити поле AvgBytesPerSec (розмір буферу, обчислюється за формулою (Channels * SamplesPerSec * BitsPerSample) / 8)
fwrite(d,11025,'int32');
%заповнити поле Align (вирівнювання (якщо кількість вибірок не кратна 2, в кінці файлу додається нульове значення). Переважно рівне 0x0001)
fwrite(d,1,'int16');
%заповнити поле BitsPerSample (кількість біт на вибірку)
fwrite(d,8,'int16');
%заповнити поле DATA_ID (заголовок даних) !!!!!!!!!
fwrite(d,hex2dec('61746164'),'int32');
%заповнити поле DATA_Length (кількість вибірок)
fwrite(d,length(y),'int32');
%вибірки сигналу
for ii = 1 : length(y);
fwrite(d,y(ii)*128 + 128,'uchar');
end;
fclose(d);
Програма стиснення аудіосигналу з потрібною степінню компресї:
[Y, F, B]=wavread('F:\sd\myRecord1.wav');
%Y – нестиснений аудіосигнал
F
B
%wavplay(Y,F,'sync');
Y = Y * 128; % Y -- дробове; треба, щоб було ціле (Y*128)
N = 160; % розмір блоку
L = 50; % к-сть збережених коефіцієнтів ДКП на блок
%***вибираємо так, щоб забезпечити необхідний степінь стиснення***
nn = fix(length(Y)/N); % к-сть блоків
mm = 1;
kk = 1;
% Компресія
for ii = 1 : nn-1
x = dct( Y(kk : kk + N-1) );
y(mm : mm + L-1) = x(1 : L); % В y записуємо лише "великі" відліки
mm = mm + L;
kk = kk + N;
end;
% Квантування
y = round(y); % До цілого
[A, X] = hist(y, min(y) : max(y));
NN = length(y);
Ls = 0;
for ii = 1 : length(A)
if(A(ii) > 0)
Ls = Ls + (A(ii)/NN) * log2(A(ii)/NN);
end;
end;
disp('-Ls = ');
-Ls
Hf=(10/-Ls)
CR2 = (10 / -Ls) * (N / L) % CR2 -- cтепінь стиснення
% 10, бо 9 біт на число (тут 3хх), і один на знак (-)
Висновок: В системах захисту широко використовуються прилади призначені для запису та відтворення інформації. Важливою складовою є акустична інформація як така і технічні пристрої призначені для її збору, зберігання та відтворення.
На прикладі цифрового диктофону, я отримав основні навички розробки пристроїв що можуть