Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Результаты реализации звуковых эффектов в среде MatLab и на сигнальном процессоре DSP



 

Результаты приведены в приложении В, а также представлены в презентации к данной курсовой работе.


Краткое руководство пользователя

 

Для удобства представления результатов работы программ, они были оформлены в презентацию, которая разработана в среде MS PowerPoint. Презентация имеет удобный и интуитивно понятный интерфейс. В неё вынесены методы наложения звуковых эффектов, использованных в курсовой работе, а также результаты – wav-файлы, которые можно прослушать, нажав кнопку . Смена слайдов осуществляется при нажатии кнопок вперед или назад, размещенных в правом нижнем углу.


Заключение

 

В данной курсовой работе необходимо была разработана в MatLab и CCS система, реализующая звуковые музыкальные эффекты в реальном времени.

В ходе разработки были выявлены основные достоинства и недостатки реализации в различных средах. Так, основной недостаток обработки сигналов на цифровом сигнальном процессоре заключается в том, что процессор не позволяет обрабатывать вектора, длиннее, чем 7000 отсчетов, что и было указано выше. Вследствие этого, не все эффекты удалось реализовать, а реализованные проигрывали в качестве звука эффектам, синтезированным на языке Matlab. Эти недостатки можно устранить, если изменить частоту дискретизации музыкального файла.


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

 

1. Секунов Н.Ю. Обработка звука на РС/ Н.Ю. Секунов. – СПб.: БХВ-Петербург, 2001. – 1248 с.

2. Бондарев В.Н. Цифровая обработка сигналов: методы и средства/ В.Н. Бондарев, Г. Трестер, В.С. Чернега.- Севастопололь: Изд-во СевГТУ, 1999. – 388с.

3. Методические указания к курсовому проектированию по дисциплине " Цифровая обработка сигналов" / Сост. В.Н. Бондарев, А.Л. Овчинников, B.С. Чернега.– Севастополь: Изд-во СевНТУ, 2003. – 94с.


ПРИЛОЖЕНИЕ А

Текст программ на MatLab

 

1. Текст программы, реализующей эффект однократной цифровой задержки

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

D=Fs*0.2; %задержка исходного сигнала

z=zeros(1, D);

xz=[z x']; %задержанный сигнал

xx=[x' z];

y=xx+0.5*xz;

 

wavwrite(y, Fs, bits, 'c: \odnkr_zad.wav');

 

 

%Графическое изображение исходного и задержанного сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

axis([1 14000 -1 1]);

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Zadergannuy signal');

 

 

%Записываем в отдельный файл отсчеты сигнала

fid=fopen('c: \x.dat', 'w');

fprintf(fid, '1651 2 0 1 %3d\n', N);

fprintf(fid, '%4d\n', x);

fclose(fid);

 

 

2. Текст программы, реализующей эффект многократной цифровой задержки с помощью трансверсального фильтра:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

%Параметры трансверсального фильтра

D1=round(Fs*0.043); a1=0.841;

D2=round(Fs*0.172); a2=0.504;

D3=round(Fs*0.01); a3=0.49;

D4=round(Fs*0.043); a4=0.379;

 

%Разница между длинами входного и выходного сигналов

D=round(Fs*0.268);

 

z1=zeros(1, D1);

z2=zeros(1, D2);

z3=zeros(1, D3);

z4=zeros(1, D4);

z=zeros(1, D);

 

%Сигнал в разных точках трансверсального фильтра

zx=[x', z 0];

xx=[z1 x'];

xz1=[xx z2 z3 z4]; y1=xz1*a1;

xxx=[z2 xx];

xz2=[xxx z3 z4]; y2=xz2*a2;

xxxx=[z3 xxx];

xz3=[xxxx z4]; y3=xz3*a3;

xxxxx=[z4 xxxx];

xz4=[xxxxx]; y4=xz4*a4;

 

y=zx+y1+y2+y3+y4;

 

wavwrite(y, Fs, bits, 'c: \mnog_trans.wav');

 

 

%Графическое изображение исходного и задержанного сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

axis([1 16000 -1 1]);

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Zadergannuy signal');

 

 

3. Текст программы, реализующей эффект многократной цифровой задержки с помощью рекурсивного фильтра:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

%Параметры рекурсивного фильтра

D=round(Fs*0.15); a=0.8;

 

z=zeros(1, D);

 

xx=[x' z z z z z z z z z];

x1=x*a;

x2=x1*a;

x3=x2*a;

x4=x3*a;

x5=x4*a;

x6=x5*a;

x7=x6*a;

x8=x7*a;

x9=x8*a;

 

y1=[z x1' z z z z z z z z]; %задержки исходного сигнала

y2=[z z x2' z z z z z z z];

y3=[z z z x3' z z z z z z];

y4=[z z z z x4' z z z z z];

y5=[z z z z z x5' z z z z];

y6=[z z z z z z x6' z z z];

y7=[z z z z z z z x7' z z];

y8=[z z z z z z z z x8' z];

y9=[z z z z z z z z z x9'];

 

y=xx+y1+y2+y3+y4+y5+y6+y7+y8+y9;

 

wavwrite(y, Fs, bits, 'c: \mnog_rec.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

axis([1 40000 -2 2]);

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

 

 

4. Текст программы, реализующей эффект детонации:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

%Diapazon izmenenia zadergki

D=round(Fs*0.025);

 

z=zeros(1, D);

 

xx=[x' z];

 

for i=1: N

 fn=round(D*0.5*(1+cos(2*pi*i/3)));

 y(1, i)=0.5*xx(1, i)+xx(1, fn+i); %разностное уравнение

end

 

wavwrite(y, Fs, bits, 'c: \detonacia.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

 

 

5. Текст программы, реализующей эффект хора:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

D=round(Fs*0.035);

 

z=zeros(1, D);

 

for i=1: 4000

 u(1, i)=x(i, 1);

end;

 

x= [u z];

 

for n=1: 4000

 fn1=round(D*0.5*(1+cos(2*pi*n/50))); %Zadergki kagdogo instrumenta

 fn2=round(D*0.5*(1+cos(2*pi*n/10)));

 fn3=round(D*0.5*(1+cos(2*pi*n/100)));

 fn4=round(D*0.5*(1+cos(2*pi*n/1000)));

 y(1, n)=0.2*x(1, n)+0.2*x(1, fn1+n)+0.2*x(1, fn2+n)+0.2*x(1, fn3+n)+0.2*x(1, fn4+n);

end

 

wavwrite(y, Fs, bits, 'c: \xor.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(xx), grid on; title('Isxodnuy signal');

axis([0 4000 -1 1]);

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

 

 

6. Текст программы, реализующей эффект вибрато:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

D=round(Fs*0.035);

 

z=zeros(1, D);

 

x= [x' z];

 

for n=1: N

 fn=round(D*0.5*(1+cos(2*pi*n/5))); %Zadergka

 y(1, n)=0.8*x(1, fn+n);

end

 

wavwrite(y, Fs, bits, 'c: \vibratto.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

axis([0 10000 -1 1]);

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

 

 

7. Текст программы, реализующей эффект компрессора:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

a=0.3;

 

for n=1: N

 if(abs(x(n, 1))< =a)

 y(1, n)=x(n, 1);

 end;

 if(abs(x(n, 1))> a)

 y(1, n)=x(n, 1)/abs(x(n, 1))*abs(x(n, 1))*a;

 end

end

 

wavwrite(y, Fs, bits, 'c: \kompress.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

 

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

axis([0 10000 -1 1]);

 

 

8. Текст программы, реализующий эффект экспандера:

 

clc;

 

%считываем исходный файл

[x, Fs, bits]=wavread('c: \1.wav');

 

N=size(x);

 

a=0.3;

 

for n=1: N

 if(abs(x(n, 1))> a)

 y(1, n)=x(n, 1);

 end;

 if(abs(x(n, 1))< =a)

 y(1, n)=x(n, 1)/abs(x(n, 1))*abs(x(n, 1))/a;

 end

end

 

wavwrite(y, Fs, bits, 'c: \exspand.wav');

 

%Графическое изображение исходного и результирующего сигналов во временной области

figure(1);

subplot(2, 1, 1);

plot(x), grid on; title('Isxodnuy signal');

 

 

figure(1);

subplot(2, 1, 2);

plot(y), grid on; title('Resyltiryushiy signal');

axis([0 10000 -1 1]);


ПРИЛОЖЕНИЕ Б

Текст программ на Си

 

1. Текст программы, реализующей эффект однократной цифровой задержки:

 

float input_x[4000];

float output_y[6200];

void dataIN(void){}

void dataOUT(void){}

 

main()

{

 

 int i;

 float xx[6200];

 float y1[6200];

 

 while(1)

 {

 dataIN();

 for (i=0; i< 2200; i++)

 y1[i]=0;

 

 for (i=2200; i< 6200; i++)

 y1[i]=input_x[i];

 

 for (i=0; i< 4000; i++)

 xx[i]=input_x[i];

 

 for (i=4000; i< 6200; i++)

 xx[i]=0;

 

 for(i=0; i< =6200; i++)

 output_y[i]=xx[i]+0.5*y1[i];

 

 dataOUT();

 }

 return 0;

}

 

2. Текст программы, реализующей эффект детонации:

 

float input_x[4000];

float output_y[4000];

void dataIN(void){}

void dataOUT(void){}

 

main()

{

 int i;

 float xx[6200];

 float y1[6200];

 

 int D=550;

 int fn;

 while(1)

 {

 dataIN();

 for (i=0; i< 4000; i++)

 xx[i]=input_x[i];

 for (i=4000; i< 4550; i++)

 xx[i]=0;

 

 for (i=0; i< 4000; i++)

 {

 fn=(D*0.5*(1+cos(2*3.14*i/3)));

 output_y[i]=0.5*xx[i]+xx[i+fn];

 }

 

 dataOUT();

 }

 return 0;

}

 

3. Текст программы, реализующей эффект хора:

 

float input_x[4000];

float output_y[4000];

void dataIN(void){}

void dataOUT(void){}

 

main()

{

 int i;

 float xx[4770];

 

 int D=770;

 int fn1; int fn2; int fn3; int fn4;

 while(1)

 {

 dataIN();

 for (i=0; i< 4000; i++)

 xx[i]=input_x[i];

 for (i=4000; i< 4770; i++)

 xx[i]=0;

 

 for (i=0; i< 4000; i++)

 {

 fn1=(D*0.5*(1+cos(2*3.14*i/50)));

 fn2=(D*0.5*(1+cos(2*3.14*i/10)));

 fn3=(D*0.5*(1+cos(2*3.14*i/100)));

 fn4=(D*0.5*(1+cos(2*3.14*i/1000)));

 

 output_y[i]=0.2*xx[i]+0.2*xx[i+fn1]+0.2*xx[i+fn2]+0.2*xx[i+fn3]+0.2*xx[i+fn4];

 }

 

 dataOUT();

 }

 return 0;

}

 

4. Текст программы, реализующей эффект компрессора:

 

float input_x[4000];

float output_y[4000];

void dataIN(void){}

void dataOUT(void){}

 

main()

{

 int i;

 

 float a;

 

 a=0.3; //koefficient kompressii

 

 while(1)

 {

 dataIN();

 

 for (i=0; i< 4000; i++)

 {

 if(abs(x[i])< =a)

 y[i]=x[i];

 if(abs(x[i])> a)

    ourput_y[i]=(x[i]/abs(x[i]))*abs(x[i])*a

 }

 

 dataOUT();

 }

 return 0;

}


ПРИЛОЖЕНИЕ В


Поделиться:



Последнее изменение этой страницы: 2020-02-16; Просмотров: 135; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.09 с.)
Главная | Случайная страница | Обратная связь