МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЗІ
Розрахункова робота
на тему:
«Розробка цифрового диктофону»
з курсу «Системи запису і відтворення інформації»
Варіант № 1
Львів – 2011
Мета роботи – отримати навики проектування та розрахунку основних вузлів цифрових пристроїв для запису і відтворення інформації з використанням сучасної елементної бази.
Завдання:
Розробити принципову електричну схему цифрового диктофону згідно завдання та навести усі необхідні розрахунки.
Скласти специфікацію елементів схеми.
Навести всі необхідні розрахунки.
Навести АЧХ розрахованого мікрофонного підсилювача + фільтра.
Написати на мові MatLab або C функції запису файлу у MMC/SD-карту, на якій встановлена файлова система FAT16.
Написати на мові MatLab або C функцію запису файлу у wav-форматі.
Написати на мові MatLab або C функцію стиснення аудіосигналу з потрібною степінню компресії.
Завдання варіанту
Варіант
Тип джерела живлення
Частота дискретизації, Гц
Степінь стиску
Час запису без стиску, годин
Тип мікрофону
Мікрофонний підсилювач + фільтр
1
1хАА
8000
4
150
Електрентний
Варіант 1
Розроблення принципової схеми цифрового диктофону
1.1 Оцінка споживаної потужності компонентів цифрового диктофону
Знаходимо необхідний об’єм NAND-Flash пам’яті:
Об’єм (Гбайт)=80003600150/1073741824=4,1 Гбайт
Отже, для побудови диктофону нам достатньо однієї мікросхеми NAND-Flash пам’яті, об’ємом 8 Гбайт.
З таблиці 7.1 вибираємо мікросхему K9NCG0854M (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 В
Вибираємо мікросхеми для формування напруг живлення елементів схеми
Оскільки одна батарейка типорозміру АА забезпечує напругу в діапазоні 0,9-1,5 В, а робоча напруга схеми 3.3 В, то необхідно використати мікросхему Step-Up стабілізатора. Step-Up стабілізатор буде живити цифрові кола та кола управління. Для аналогових кіл будемо використовувати LDO-стабілізатор на вихідну напругу 3.0 В.
В якості LDO-стабілізатора використаємо схему LP3985-3.0 з максимальним струмом навантаження 150 мА. При вхідній напрузі 3.3 вольта вихідна напруга такого LDO-стабілізатора рівна 3.0 В, тобто спад напруги на регулювальному транзисторі буде рівний 0.3 В.
Для Step-Up стабілізатора вибираємо схему TPC61025DRC (Texas Instruments). По DataSheet (Рис. 1) перевіряємо чи зможе ця мікросхема віддавати струм ≥ 200 мА при вхідній напрузі 0,9 В (батарея повністю розряджена).
Синтез принципової схеми кіл живлення та розрахунок її параметрів
На підставі типових схем включення, наведених в DataSheet, синтезуємо принципову схему кіл живлення (Рис. 2).
Рис. 2. Схема принципова кіл живлення
Вхідний конденсатор служить для придушення пульсації та електромагнітних завад. Згідно DataSheet конденсатор С1 повинен бути керамічний, з ємністю не менше 10 мкФ та діелектриком типуX7R або X5R.
Вибираємо С1 = 10 мкФ (SDM-конденсатор, 0805, 10%, 16 В, X5R).
Детектор розряду батарей сигналізує про те що напруга батареї стала менше певного порогу VTRN, який задається резисторами R1 і R2.
Напруга на резисторі R2 рівна напрузі внутрішнього джерела сигналу VR2 = 0.5 В. Значення резистора R2 вибирається таким чином, щоб струм, який протікає через нього був у ≥ 100 разів більше вхідного струму виводу LBI (Low Battery Input). Типовий струм виводу LBI становить ІLBI = 0.01 мкА.
ІR2 = 0.01 мкА * 100 = 1 мкА.
Знаходимо опір резистора R2:
Вибираємо R2 = 510 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
Задаємо поріг розряду батарей 2.1 В. Тоді
Вибираємо R1=1650 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
Вивід LDO сигналізує про зниження напруги нижче порогу встановленням в 0. Цей вивід є з відкритим колектором, тому його потрібно підключити до напруги живлення через підтягуючий резистор R3.
Приймемо R3=1 МОм (SMD-транзистор, 0805, 5%, 0,125 Вт).
Струм IL через індуктивність L1 визначається за формулою:
,
де IOUT - вихідний струм; VOUT – вихідна напруга; VBAT – мінімальна вхідна напруга.
Отже
А,
Значення індуктивності L1 повинно знаходитися в межах 2.2-22 мкГн. Формула для оцінки номінального значення L1:
де – пульсації струму, які не повинні перевищувати 20% від середнього значення струму через індуктивність; f – частота переключення (згідно DataSheet fMIN =480 кГц, fTYP = 600 кГц, fMAX = 720 кГц).
Отримаємо
мГц
Приймемо L1 = 6,8 мкГн. Вибираємо індуктивність B82462G4222M000.
Вихідний конденсатор визначає максимальні пульсації вихідної напруги. Пульсації визначаються двома параметрами конденсатора: ємністю та еквівалентним послідовним опором (ESR). Мінімальне значення ємності за умови ESR=0 визначається виразом:
,
де f – частота переключення; -максимальні дозволені пульсації.
Для пульсацій мВ, отримаємо
мкФ.
Виберемо конденсатор С3=100 мкФ, з робочою напругою 10 В та ESR=18 мОм типу T520B336M010A(1)E018.
Паралельно вмикаємо керамічний конденсатор С2=2.2 мкФ (SMD-конденсатор, 0805, 10%, 25 В, X7R).
Додаткові пульсації за рахунок ESR конденсатора С3 будуть становити:
мВ.
Живлення аналогових кіл мікрофону та підсилювача здійснюється від напруги AVCC=3.0 B, яка формується LDO-стабілізатором DA2. Якщо запис не ведеться, то для зменшення енергоспоживання мікросхема DA2 відключається мікроконтролером, шляхом подачі сигналу логічного нуля на вивід MICEN.
В якості вхідного конденсатора С4 рекомендований керамічний з ємністю 1 мкФ.приймаємо С4=1мФ. Згідно рекомендацій DataSheet вибираємо С5=10 мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R) та С6=1 мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R).
Синтез схеми мікрофонного підсилювача та фільтра
Приймемо, що максимальний рівень звукового тиску SPL = 100 дБ.
Знаходимо абсолютне значення звукового тиску:
При типовій чутливості мікрофону S=-48 дБ, будемо мати напругу
мВ.
Оскільки вбудований АЦП мікроконтролера ATmega16 має діапазон перетворення від 0 до AVCC, а сигнал підсилюється відносно середнього рівня AVCC/2, то коефіцієнт підсилення
Згідно технічних даних мікрофона резистор R1 повинен бути 2.2 кОм. Вибираємо резистор R1=2.2 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
Подільник напруги на резисторах R4 та R5 формує напругу зміщення рівну AVCC/2=1.5 В. Вибираємо R4=R5=100 кОм (SMD-резистори, 0805, 5%, 0.125 Вт).
Значення ємності конденсатора С2 згідно даних становить 1 мкФ. Вибираємо конденсатор С2=1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, Х7R).
Коефіцієнт підсилення рівний:
Вибираємо R2=2,5кОм (SMD-резистор, 0805, 1%, 0.125 Вт). Тоді
кОм
Вибираємо R3=470kОм (SMD-резистор, 0805, 1%, 0.125 Вт).
Визначимо частоту зрізу фільтру з теорема Котельникова:
Згідно завдання частота дискретизації становить 8000 Гц. Отже
Гц
Приймемо частоту зрізу дещо меншою, оскільки АЧХ фільтра повільно спадає. Отже
Гц
Частоту зрізу фільтра Fc приймемо дещо меншою Fmax, оскільки АЧХ фільтра Баттерворта досить повільно спадає. Приймемо, що Fc=3500 Гц.
Вибираємо С1=0,1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, X7R), С3=10 пФ (SMD-конденсатор, 0805, 10%, 25 В, X7R).
Резистор R6 та конденсатор С3 утворюють додатковий RС-фільтр низьких частот, сигнал з виходу якого подається на вхід АЦП. Вибираємо С4=1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, X7R), R6=5 kОм (SMD-резистор, 0805, 1%, 0.125 Вт)
Резистор R7 – резистор навантаження, тому R7=1 МОм (SMD-резистор, 0805, 5%, 0.125 Вт)
Синтез схеми підключення 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 Вт.
Визначаємо час неперервної роботи диктофону від джерела живлення 1АА
год.
де С=2700 мА/год – ємність однієї батарейки типу АА
Специфікації
№
К-ть
Позначення
Опис
Маркування
Виробник
Корпус
Номікал
Резисторн
1
1
R1
SMD-резистор, 0805, 5%, 0.125 Вт
Any
Any
0805
2.2 КОм
2
1
R2
SMD-резистор, 0805, 5%, 0.125 Вт
Any
Any
0805
35 Ом
3
2
RЗ, R4
SMD-резистор, 0805, 5%, 0.125 Вт
Any
Any
0805
100 KОм
4
2
R5,R6
SMD-резистор, 0805, 5%, 0.125 Вт
Any
Any
0805
6600 Ом
5
7
R13-R19, R22-R23
SMD-резистор, 0805,5%, 0.125 Вт
Any
Any
0805
51 КОм
6
2
R20, R21
SMD-резистор, 0805,5%, 0.125 Вт
Any
Any
0805
470 Ом
Конденсатори
7
8
Cl,С2,С5-С10
SMD-конденсатор, 0805, 10%, 16 В, X5R
Any
Any
0805
1 мкФ
8
2
C3,С4
SMD-конденсатор, 0805, 10%, 25 В, X7R
Any
Any
0805
5 нФ
Діоди
9
1
D1
Світлодіод, Red
SML-311UT
Rohm
0603
10
1
D2
Сбітлодіод, Blue
SML-311BT
Rohm
0603
Мікросхемн
11
1
DDI
Мікроконтролер
ATmegal6L-8AU
Atmel
44-TQFP
12
1
DD2
NAND-Flash иам'ятъ 2Гх8 6ít
K9LAG08U0M
Samsung
4S-TSOP
13
1
DAI
LDO –стабілізатор 3.0 B
LP3985IBP5-3.0
National Semiconductor
SOT-23-5
14
1
DA2
LDO –стабілізатор 2.7 B
LP3985IBP5-2.7
National Semiconductor
SOT-23-5
15
1
DA3
Операційний підсилювач
TLV2252IDR
Texas Instruments
SOIC-S
Решта
16
1
ZQ
SMD-кварцовий резонатор 8.0 МГц, 22 пФ
Q-8.0-SMU3-22-30/50
Jauch
SMU3
8.0 МГц
17
3
SW1-SWJ
Вертикальні Slide-Switch 1Р1Т
SS-11G05
Wealth Metal Factory Ltd
SS-11G05
18
1
XI
MMC/SD-слот
ССМ05-5507
ITTIndustries
MMC/SD
19
1
LI
SMD-індуктивність, 20%, 1.65 А
B82462G4682M000
Epcos
6.3x6.3x3.0
6.8 икГн
АЧХ розрахованого підсилювача + фільтра
Рис. 10. АЧХ мікрофонного підсилювача + фільтра
Лістинги програм
Програма запису файлу у MMC/SD-карту, на як й встановлена файлова система FAT16:
clear all;
BytesPerSec = 512;
Buffer = zeros(BytesPerSec, 1);
s = MMC_SD_Init('D:\Розраха СЗВ \Fat\До_5_лаби \SD_512\SD_512.bin');
VBR_Addr = 0;
LBA = 0;
[Buffer, cl] = MMC_SD_Read_Sector(s, LBA);
if (Buffer(511) </span>~= hex2dec('55')| Buffer(512) </span>~= hex2dec('AA'))
disp ('VBR FAT Error1');
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);
NumFATs = Buffer(hex2dec('10') + 1);
z = sprintf ('Кількість таблиць FAT: %d', NumFATs);
disp (z);
RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1);
z = sprintf ('Кількість записів в кореневому каталозіRoot Directory: %d', RootEntCnt);
disp(z);
TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1);
if TotSec ==0
</span>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);
SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1);
z = sprintf ('Розмір таблиціFAT y ceктоpax: %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('3A')+ 1)~='6')
disp('FAT16 Error');
end;
temp = Buffer ((hex2dec('36') + 1):(hex2dec ('3A' + 1)));
z = sprintf ('Тип файлової системи: %s', char(temp));
disp (z) ;
FAT_Sect1 = VBR_Addr + RsvdSecCnt;
z = sprintf ('Перший сектор FAT1: %d', FAT_Sect1);
disp (z) ;
if (NumFATs > 1)
</span>FAT_Sect2 = FAT_Sect1 + SecPerFAT;
</span>z = sprintf ('Перший сектор FAT2 : %d', FAT_Sect2);
disp (z) ;
end;
RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs;
z = sprintf ('Перший сектор Root Directory: %d', RootDir_Sect);
disp(z) ;
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
Byte_F = 1; % початoк запису в байтах
Flag = 0; % прапорець знаходження вільного запису в RootDirectory
for jj = 1 : RootDir_SectCnt %від 1-го до останнього сектору RootDirectory
[Buffer, cl] = MMC_SD_Read_Sector(s, RootDir_Sect + jj - 1); %читає поточний сектор
for ii = 1 : BytesPerSec/32 % лічильник записів
</span>temp = Buffer(1); % читає перший байт
if (temp == 0 | temp == hex2dec('E5'))
</span>z = sprintf('Вільний запис знайдено');
disp(z);
</span>Free_Sect_RootDir = RootDir_Sect + jj - 1;
</span>z = sprintf('Сектор вільного запису в RootDirectory: %d', Free_Sect_RootDir);
disp(z);
</span>Free_Num_RootDir = ii;
</span>z = sprintf('Номер вільного запису: %d', Free_Num_RootDir);
disp(z);
</span>Flag = 1;
break;
end;
</span>Byte_F = Byte_F + 32; %наступний запис (1 запис--32байти)
end;
if (Flag == 1) %файл знайдено
break;
end;
</span>Byte_F = 1;
end;
if (Flag == 0)
</span>z = sprintf('Неможливо записати файл: нема вільної памят ');
disp(z);
return; %вихід з програми
end;
Our_File = zeros(512,1); %створю ємо файл
File_Size = length(Our_File ); % довжина файлу
for i = 1 : ceil(File_Size / (SecPerClus * BytesPerSec))%від 1-го до останнього кластеру файлу
%шукаємо вільний кластер
First = 1;
Flag = 0;
temp = FAT_Sect1;
Free_Cluster = 0;
for jj = 1 : SecPerFAT
[Buffer, cl] = MMC_SD_Read_Sector(s, temp + jj - 1);
for ii = 1 : 2 : SecPerFAT * BytesPerSec
</span>free = Buffer (First);
if (Buffer(ii) + 256 * Buffer(ii + 1) == 0) %якщо кластер вільний
</span>Flag = 1;
break;
end;
</span>Free_Cluster = Free_Cluster + 1;
end;
if (Flag ==1)
break;
end;
end
z = sprintf('1-ий вільний кластер у таблиці FAT: %d', Free_Cluster);
disp(z);
end;
% запис в FAT
</span>Buffer(ii) = 255;
Buffer(ii + 1) = 255;
</span>wr = MMC_SD_Write_Sector(s, FAT_Sect1 + jj - 1, Buffer);
% запис в Rood Directory
[Buffer, cl] = MMC_SD_Read_Sector(s, Free_Sect_RootDir);
Our_File_1 = zeros (32,1);
% ім'я файлу
Our_File_1(1) = 'N';
Our_File_1(2) = 'A';
Our_File_1(3) = 'M';
Our_File_1(4) = 'E';
Our_File_1(5) = 32;
Our_File_1(6) = 32;
Our_File_1(7) = 32;
Our_File_1(8) = 32;
%розширення файлу
Our_File_1(9) = 'W';
Our_File_1(10) = 'A';
Our_File_1(11) = 'V';
%номер першого кластеру
Our_File_1(28) = fix(Free_Cluster/256);
Our_File_1(27) = Free_Cluster - 256 * Our_File(28);
% розмір файлу
</span>Our_File_1(29) = 512;
</span>Our_File_1(30) = 0;
</span>Our_File_1(31) = 0;
</span>Our_File_1(32) = 0;
Buffer(32*(Free_Num_RootDir-1) + 1 : 32*(Free_Num_RootDir-1) + 1 +31) =Our_File_1;
wr = MMC_SD_Write_Sector(s, Free_Sect_RootDir, Buffer);
fclose(s);
Програма запису файлу у wav-формат :
clear all;
% відкрити файл для запису
[y,Fs,bits]=wavread('D:\Розраха СЗВ \Wav\Lab_1_5.wav');
d=fopen('D:\Розраха СЗВ \Wav\My.wav','wb');
% заповнити поле RIFF_ID 52494646
fwrite(d, hex2dec('46464952'),'int 32');
% заповнити поле FILE_Length ?????
fwrite(d, 4000, 'int32');
% заповнити поле WAVE_ID 57415645
fwrite(d, hex2dec('45564157'), 'int32');
% заповнити поле FMT_ID 666d7420
fwrite(d, hex2dec('20746d66'), 'int32');
% заповнити поле FMT_Length
fwrite(d, 16, 'int32');
% заповнити поле Type 0x0001 - простої вибірки
fwrite(d, 1, 'int16');
% заповнити поле Channels >>> Mono = 1, Stereo = 2,
fwrite(d, 1, 'int16');
% заповнити поле SamplesPerSec>>> частота дискретизації- Гц лаб 1
fwrite(d, 4000 , 'int32');
% заповнити поле AvgBytesPerSec >>> </span>== Channels * SamplesPerSec * BitsPerSample/8
fwrite(d, 4000, 'int32');
% заповнити поле Align >>> вирівнювання (якщо кількість вибірок не кратна2, в кі нцевому файлу додається нульове значення). Переважно рівне 0х0001
fwrite(d, 1, 'int16');
% заповнити поле BitsPerSample >>> 0х0008 - 8 біт на вибірку
fwrite(d, 8, 'int16');
% заповнити поле DATA_ID >>> Завжди рівний "data" =0x64617461
fwrite(d, hex2dec('61746164'), 'int32');
% заповнити поле DATA_Length >>> == NumSamples * Channels * BitsPerSample/8 к-сть вибірок
fwrite(d, 4000, 'int32');
%вибірки сигналу
for ii = 1 : 4000
fwrite(d,y(ii)*128+128,'uchar');
end;
fclose(d);
Програма стиснення аудіосигналу з потрібною степінню компресії:
[y, Fs, bits]=wavread('D:\Розраха СЗВ \Wav\Lab_1_5.wav');
Fs
bits
figure(1);
hist(y*128, -128 : 127);
n = hist(y*128, -128 : 127);
P = n /length(y);
Nopt = 0;
for ii = 1 : 256
if (P(ii)>0)
</span>Nopt = Nopt - P(ii)*log2(P(ii));
end;
end;
Nopt
CR1 = bits / Nopt;
Y = y*128;
N = 128;
L=7;
nn = fix(length(Y)/N);
mm = 1;
kk = 1;
for ii=1 : nn - 1
</span>x = dct( Y(kk : kk + N - 1) );
y(mm : mm + L - 1) = x(1 : L);
</span>mm = mm + L;
</span>kk = kk + N;
end;
y = round(y);
figure(2);
hist(Y, min(y) : max(y));
[A, X] = hist(y, min(y) : max(y));
NN = length(y);
Ls=0;
for ii = 1 : length(A)
if (A(ii) > 0)
</span>Ls = Ls + (A(ii)/NN) * log2(A(ii)/NN);
end;
end;
disp('-LS = ');
-Ls
CR2 = (10 / -Ls) * (N / L)
%return;
YC = Y * 0;
dx = Y(1 : N) * 0;
mm = 1;
kk = 1;
for ii = 1 : nn - 1
</span>dx(1:L) = y(mm : mm + L - 1);
</span>x1 = idct( dx );
YC (kk : kk + N - 1) = x1;
</span>dx = dx * 0;
</span>mm = mm + L;
</span>kk = kk + N;
end;
YC = YC / 128;
YC = round(YC * 128) / 128;
%wavplay(YC, Fs);
figure(3);
strips(YC, 30000);