- •Содержание
- •Введение
- •1. Обзор существующих методов решения задачи
- •1.2 Перцептивное кодирование
- •2. Обоснование выбранного метода
- •3. Разработка структурной схемы системы
- •4. Разработка и тестирование модели
- •5. Разработка программного обеспечения на языке си
- •Библиографический список
- •Приложение а Текст программы на языке matlab
- •Приложение б Текст программы на языке си
5. Разработка программного обеспечения на языке си
Для решения задачи, вынесенной на курсовое проектирование, по сжатию и восстановлению аудио файлов была разработана программа на языке Си, которая состоит из следующих основных функций:
- b2d (int cnt) – функция, осуществляет перевод двоичного представления числа с фиксированной запятой в его десятичный эквивалент.
- d2b (int cnt) – функция, осуществляет перевод десятичного числа с фиксированной запятой в его двоичный эквивалент.
- fft (complex *D, int d0, int n, int st, int x0) – функция, осуществляет вычисление спектральных коэффициентов на основе алгоритма быстрого преобразования Фурье.
- ifft(complex *D, int d0, int n, int st, int x0) – функция, осуществляет обратное преобразование Фурье.
- Compress() – функция, осуществляет сжатие информации.
- UnCompress() – функция, осуществляет восстановление сжатой информации.
Основным достоинством программы является эффективность вычислений, полученная в результате реализации быстрых алгоритмов преобразования Фурье.
При разработке программы были использованы переменные типа double, в результате чего ожидаемая степень сжатия аудио информации оказалась ниже чем предполагалась. Теоретически сжатие предполагалось осуществить в пять раз, но в связи с тем, что при работе с программой использовались переменные типа double, которые занимаю восемь байт. Формат данных, которые хранятся в сжатом файле, представляют собой следующий вид:
{{Re, Img}, No, Energy}
где {Re, Img} – комплексное число, содержащее значение гармоники;
No – номер частоты на которой находилась гармоника до сжатия;
Energy – энергия сигнала, обрабатываемого блока.
Таким образом для хранения одного значения сжатых данных необходимо отводить:
double+double+unsigned int+unsigned int = 8+8+2+2 = 20 байт.
В результате получилось так, что практическая степень сжатия не соответствует расчетной. При этом восстановленные аудио данные заметно искажены.
Алгоритм работы программы в соответствии со схемой системы представлен на рисунке 5.1.
Рисунок 5.1 - Блок – схема алгоритм программы
Текст приложения на языке Си представлен в приложении Б.
Библиографический список
-
Бондарев В.Н. Цифровая обработка сигналов / Бондарев В.Н., Трестер Г., Чернега В.С: методы и средства. – Х.: Изд-во «Конус», 2001 г. – 388 с.
-
Секунов Н.Ю. Обработка звука на РС. – СПб: БХВ-Петербург 2001г. – 1248с.
Приложение а Текст программы на языке matlab
Ниже представлен текст приложения, моделирующего систему сжатия аудиосигналов в среде MATLAB.
clear; %очистка памати
sec=5;
[x,fs,bits]=wavread('D:\WIN98\MEDIA\Ctmelody.wav'); %чтение аудиофайла %D:\WIN98\MEDIA\Ctmelody.wav
BLOCKSIZE=1024; %размер обрабатываемого блока
CROSS=512; %перекрытие соседних блоков
scale=BLOCKSIZE/22050; %масштабирующий коэффициент при пересчете граничных частот барков
n=size(x,1);
N=ceil((size(x,1)-BLOCKSIZE)/(BLOCKSIZE-CROSS)+1) %количество обрабатываемых блоков для каждого канала
CHANELSIZE=(BLOCKSIZE-CROSS)*(N-1)+BLOCKSIZE;
x1(1:CHANELSIZE)=0; %обнуление каждого канала с целью создания количества отсчетов,
x2(1:CHANELSIZE)=0; % кратных размеру блока (BLOCKSIZE)
x1(1:n)=x(1:n,1); %выделение первого канала
x2(1:n)=x(1:n,2); %выделение второго канала
blockenergy(1:N,1:2)=0;
%---------СЖАТИЕ----------%
for iindex=0:N-1, %перебор всех блоков сигнала
%------ПЕРВЫЙ КАНАЛ----------
block1=x1((BLOCKSIZE-CROSS)*iindex+1 : (BLOCKSIZE-CROSS)*iindex+BLOCKSIZE); %взятие очередного блока
blockenergy(iindex+1,1)=sum(abs(block1));
block=fft(block1.*hamming(BLOCKSIZE)'); %переход в частотную область при помощи ПФ
%выбор отсчетов с максимальным модулем амплитуды из диапазонов,
% соответствующих кретичиским полосам восприятия
% prblock - результат сжатия, состоящий из выбранных
% номеров отсчетов и их значений
XCOUNT=0; %количество отчетов в блоке после сжатия
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(0*scale+1),fix(100*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(100*scale+1),fix(200*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(200*scale+1),fix(300*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(300*scale+1),fix(400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(400*scale+1),fix(510*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(510*scale+1),fix(630*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(630*scale+1),fix(770*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(770*scale+1),fix(920*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(920*scale+1),fix(1080*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1080*scale+1),fix(1270*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1270*scale+1),fix(1480*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1480*scale+1),fix(1720*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1720*scale+1),fix(2000*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2000*scale+1),fix(2320*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2320*scale+1),fix(2700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2700*scale+1),fix(3150*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(3150*scale+1),fix(3700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(3700*scale+1),fix(4400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(4400*scale+1),fix(5300*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(5300*scale+1),fix(6400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(6400*scale+1),fix(7700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(7700*scale+1),fix(9500*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(9500*scale+1),fix(12000*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(12000*scale+1),fix(15500*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(15500*scale+1),fix(22050*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
prx1(1:2,XCOUNT*iindex+1: XCOUNT*iindex+XCOUNT)=prblock; %результат сжатия сигнала
%------ВТОРОЙ КАНАЛ----------
block1=x2((BLOCKSIZE-CROSS)*iindex+1 : (BLOCKSIZE-CROSS)*iindex+BLOCKSIZE); %взятие очередного блока
block=fft(block1.*hamming(BLOCKSIZE)'); %переход в частотную область при помощи ПФ
blockenergy(iindex+1,2)=sum(abs(block1));
%выбор отсчетов с максимальным модулем амплитуды из диапазонов,
% соответствующих кретичиским полосам восприятия
% prblock - результат сжатия, состоящий из выбранных
% номеров отсчетов и их значений
XCOUNT=0; %количество отчетов в блоке после сжатия
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(0*scale+1),fix(100*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(100*scale+1),fix(200*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(200*scale+1),fix(300*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(300*scale+1),fix(400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(400*scale+1),fix(510*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(510*scale+1),fix(630*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(630*scale+1),fix(770*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(770*scale+1),fix(920*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(920*scale+1),fix(1080*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1080*scale+1),fix(1270*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1270*scale+1),fix(1480*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1480*scale+1),fix(1720*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(1720*scale+1),fix(2000*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2000*scale+1),fix(2320*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2320*scale+1),fix(2700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(2700*scale+1),fix(3150*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(3150*scale+1),fix(3700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(3700*scale+1),fix(4400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(4400*scale+1),fix(5300*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(5300*scale+1),fix(6400*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(6400*scale+1),fix(7700*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(7700*scale+1),fix(9500*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(9500*scale+1),fix(12000*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(12000*scale+1),fix(15500*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
XCOUNT=XCOUNT+1;
[amp,no]=maxabs(block,fix(15500*scale+1),fix(22050*scale));
prblock(1:2,XCOUNT)=[no; block(no)];
XCOUNT=XCOUNT+1;
prblock(1:2, XCOUNT)=[BLOCKSIZE+1-no; block(BLOCKSIZE+1-no)];
prx2(1:2,XCOUNT*iindex+1: XCOUNT*iindex+XCOUNT)=prblock; %результат сжатия сигнала
end
%------КОНЕЦ СЖАТИЯ------%
%-----ВОССТАНОВЛЕНИЕ-----%
y1(1:CHANELSIZE)=0; %создание 1-го выходного канала
y2(1:CHANELSIZE)=0; %создание 2-го выходного канала
%итерация для первого блока
iindex=0;
%------ПЕРВЫЙ КАНАЛ----------
block1(1:BLOCKSIZE)=0;
for jindex=1:XCOUNT, %перебор всех отсчетов блока сжатого сигнала
block1(prx1(1,XCOUNT*iindex+jindex))=prx1(2,XCOUNT*iindex+jindex);
end
block=real(ifft(block1));
block=block*blockenergy(iindex+1,1)/sum(abs(block)); %нормировка
y1((BLOCKSIZE-CROSS)*iindex+1:(BLOCKSIZE-CROSS)*iindex+BLOCKSIZE)=block;
crossblock=block(BLOCKSIZE-CROSS+1:BLOCKSIZE); %блок наложения (перекрытия) - инициализация значения
%------ВТОРОЙ КАНАЛ----------
block1(1:BLOCKSIZE)=0;
for jindex=1:XCOUNT, %перебор всех отсчетов блока сжатого сигнала
block1(prx2(1,XCOUNT*iindex+jindex))=prx2(2,XCOUNT*iindex+jindex);
end
block=real(ifft(block1));
block=block*blockenergy(iindex+1,2)/sum(abs(block)); %нормировка
y2((BLOCKSIZE-CROSS)*iindex+1:(BLOCKSIZE-CROSS)*iindex+BLOCKSIZE)=block;
crossblock2=block(BLOCKSIZE-CROSS+1:BLOCKSIZE); %блок наложения (перекрытия) - инициализация значения
for iindex=1:N-1, %перебор всех оставшихся блоков сигнала
%------ПЕРВЫЙ КАНАЛ----------
block1(1:BLOCKSIZE)=0; %
for jindex=1:XCOUNT, %перебор всех отсчетов блока сжатого сигнала
block1(prx1(1,XCOUNT*iindex+jindex))=prx1(2,XCOUNT*iindex+jindex);
end
block=real(ifft(block1));
block=block*blockenergy(iindex+1,1)/sum(abs(block)); %нормировка
crossblock=(crossblock+block(1:CROSS))./2; %блок наложения (перекрытия) - среднее между предыдущим и последующим блоком
y1((BLOCKSIZE-CROSS)*iindex+1:(BLOCKSIZE-CROSS)*iindex+BLOCKSIZE)=[crossblock block(CROSS+1:BLOCKSIZE)];
crossblock=block(BLOCKSIZE-CROSS+1:BLOCKSIZE);
%------ВТОРОЙ КАНАЛ----------
block1(1:BLOCKSIZE)=0; %
for jindex=1:XCOUNT, %перебор всех отсчетов блока сжатого сигнала
block1(prx2(1,XCOUNT*iindex+jindex))=prx2(2,XCOUNT*iindex+jindex);
end
block=real(ifft(block1));
block=block*blockenergy(iindex+1,2)/sum(abs(block)); %нормировка
crossblock2=(crossblock2+block(1:CROSS))./2; %блок наложения (перекрытия) - среднее между предыдущим и последующим блоком
y2((BLOCKSIZE-CROSS)*iindex+1:(BLOCKSIZE-CROSS)*iindex+BLOCKSIZE)=[crossblock2 block(CROSS+1:BLOCKSIZE)];
crossblock2=block(BLOCKSIZE-CROSS+1:BLOCKSIZE);
end
y(1:n,1)=y1(1:n)';
y(1:n,2)=y2(1:n)';
%--КОНЕЦ ВОССТАНОВЛЕНИЯ--%
%построение графиков
figure(1);
subplot(2,1,1);
plot(x);
subplot(2,1,2);
plot(y);
wavwrite(y,fs,bits,'d:\test4.wav');