Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSP_CP.doc
Скачиваний:
19
Добавлен:
02.12.2018
Размер:
209.41 Кб
Скачать

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 - Блок – схема алгоритм программы

Текст приложения на языке Си представлен в приложении Б.

Библиографический список

  1. Бондарев В.Н. Цифровая обработка сигналов / Бондарев В.Н., Трестер Г., Чернега В.С: методы и средства. – Х.: Изд-во «Конус», 2001 г. – 388 с.

  2. Секунов Н.Ю. Обработка звука на РС. – СПб: БХВ-Петербург 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');

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]