数字信号处理Day1自制电子音乐

第一天的课程感觉比較简单,主要介绍Karplus-Strong Algorithm

给出方程
y[n]=αy[n?M]+x[n],

x[n]是输入,M是延迟,α是衰弱系数

我们要衰减D次,总的採样数就是D*M

以下是最直接的实现

关于x
= x(:).‘;的语法是这种,这是一个转置,可是是非共轭转置,假设是x‘,那么1+i就成了1-i

function y = ks_loop(x, alpha, D)

% Length of the output signal must be larger than the length of the input signal,
% that is, D must be larger than 1
if D < 1
    error(‘Duration D must be greater than 1‘);
end    

% Make sure the input is a row-vector
x = x(:).‘;

% Number of input samples
M = length(x);

% Number of output samples
size_y = D * M;

% Initialize with random input x
y = zeros(1, size_y);
y(1:M) = x;

for index = (M+1):size_y
    y(index) = alpha * y(index - M);
end

y = y(:);

return

以下来測试一下

x = randn(100, 1);

stem(x);

y
= ks_loop(x, 0.9, 10);

stem(y);

事实上,你已经完毕了KS算法

要知道,在matlab和octave这种软件中,矩阵运算比单个运算速度要快非常多,于是就有了优化的版本号

function y = ks(x, alpha, D)

% Length of the output signal must be larger than the length of the input signal,
% that is, D must be larger than 1
if D < 1
    error(‘Duration D must be greater than 1.‘);
end  

% Make sure the input is a row-vector
x = x(:).‘;

% Number of input samples
M = length(x);

% number of output samples
size_y = D * M;

% Create a vector of the powers of alpha, [alpha^0 alpha^1 ....]
size_alphaVector = D;
alphaVector = (alpha*ones(size_alphaVector,1)).^((0:(size_alphaVector-1))‘);

% Create a matrix with M columns, each being the vector of the powers of alpha
alphaMatrix = repmat(alphaVector, 1, M);

% Create a matrix with D rows filled by the input signal x
xMatrix = repmat(x, D, 1);

% Multipliy the two, and take the transpose so we can read it out
% column-by-column
yMatrix = (alphaMatrix .* xMatrix).‘;

% Read out the output column by columnn
y = yMatrix(:);

return

在matlab中,你能够用soundsc(y, FS)来播放音乐

y是我们的採样数据,FS是频率

以下这个样例能够播放opening
chord of Hard day‘s night
开头的音乐,太奇妙了

由于牵扯到音乐的相关知识,一些參数就不大懂,仅仅画出了最后的採样图看看

clear all
close all
clc

% Parameters:
%
% - Fs       : sampling frequency
% - F0       : frequency of the notes forming chord
% - gain     : gains of individual notes in the chord
% - duration : duration of the chord in second
% - alpha    : attenuation in KS algorithm

Fs = 48000;

% D2, D3, F3, G3, F4, A4, C5, G5
F0 = 440*[2^-(31/12); 2^-(19/12); 2^-(16/12); 2^(-14/12); 2^-(4/12); 1; 2^(3/12); 2^(10/12)];
gain = [1.2 3.0 1.0 2.2 1.0 1.0 1.0 3.5];
duration = 4;
alpha = 0.9785;

% Number of samples in the chord
nbsample_chord = Fs*duration;

% This is used to correct alpha later, so that all the notes decay together
% (with the same decay rate)
first_duration = ceil(nbsample_chord / round(Fs/F0(1)));

% Initialization
chord = zeros(nbsample_chord, 1);

for i = 1:length(F0)

    % Get M and duration parameter
    current_M = round(Fs/F0(i));
    current_duration = ceil(nbsample_chord/current_M);

    % Correct current alpha so that all the notes decay together (with the
    % same decay rate)
    current_alpha = alpha^(first_duration/current_duration);

    % Let Paul‘s high D on the bass ring a bit longer
    if i == 2
        current_alpha = current_alpha^.8;
    end

    % Generate input and output of KS algorithm
    x = rand(current_M, 1);
    y = ks(x, current_alpha, current_duration);
    y = y(1:nbsample_chord);

    % Construct the chord by adding the generated note (with the
    % appropriate gain)
    chord = chord + gain(i) * y;
end

% Play output
soundsc(chord, Fs);

数字信号处理Day1自制电子音乐,布布扣,bubuko.com

时间: 2024-10-31 13:06:53

数字信号处理Day1自制电子音乐的相关文章

大牛讲解信号与系统以及数字信号处理

转自人人网 第一课 什么是卷积 卷积有什么用 什么是傅利叶变换 什么是拉普拉斯变换 引子很多朋友和我一样,工科电子类专业,学了一堆信号方面的课,什么都没学懂,背了公式考了试,然后毕业了. 先说"卷积有什么用"这个问题.(有人抢答,"卷积"是为了学习"信号与系统"这门课的后续章节而存在的.我大吼一声,把他拖出去枪毙!) 讲一个故事:张三刚刚应聘到了一个电子产品公司做测试人员,他没有学过"信号与系统"这门课程.一天,他拿到了一个产

数字信号处理--傅里叶变换

原文出处: 韩昊 1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事 谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师. 转载的同学请保留上面这句话,谢谢.如果还能保留文章来源就更感激不尽了. ——更新于2014.6.6,想直接看更新的同学可以直接跳到第四章———— 我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两

傅立叶变换的深入理解 转载 数字信号处理

傅立叶变换的深入理解 2007年10月05日 星期五 16:41 专题讨论四:关于傅里叶变换的讨论[精彩] 有奖征集:大家讨论一下傅里叶变换相关的内容: 1 变换的目的,意义,应用. 2 傅里叶级数与傅里叶变换的差别和联系 3 连续傅里叶变换,离散时间傅里叶变换,离散傅里叶变换,序列的傅里叶变换,各自的定义,差别,联系. 3 高速傅里叶变换的实质,经常使用的算法之间的差别和联系,各自的优势. 4 fft的应用讨论: 1.变换是时间变量函数变成相应变换域的某种变量函数,这样使运算简单,处理方便.变

转载--理解数字信号处理的三把钥匙

原址 在数字信号处理大厦中,有许许多多的小房间,有的门上写着"DFT",有的门上写着"滤波",有的门上写着"卷积",有的门上写着"相关",等等.每一个房间都藏着知识的秘密,每一个房间都要用属于自己的钥匙才能打开.但就整体上来说,理解数字信号处理有三把"万能"的钥匙:时域与频域的相互切换.向量和MATLAB软件.充分应用这三把钥匙,能为深入理解数字信号处理提供有力的帮助. 1.时域与频域的相互切换 深入理解数

FS,FT,DFS,DTFT,DFT,FFT的联系和区别 数字信号处理

DCT变换的原理及算法 文库介绍 对于初学数字信号处理(DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. 学习过<高等数学>和<信号与系统>这两门课的朋友,都知道时域上任意连续的周期信号可以分解为无限多个正弦信号之和,在频域上就表示为离散非周期的信号,即时域连续周期对应频域离散非周期的特点,这就是傅里叶级数展开(FS),它用于分析连续周期信号. FT是傅里叶变换,它主要用于分析连续非周期信号,由于信号是非周期的,它必包含了各种频率的信号,

数字信号处理MATLAB简单序列

数字信号处理应用的几个基本序列: 1 单位样本序列 function mainImseq() clc clear disp('生成抽样序列'); y=imseq(1,1,5); %调用样本函数,此时序列下标以1开头(1~5之间5个数,下标为1的抽样值为1) %子函数imseq:抽样函数 function [x,n]=imseq(n0,n1,n2) n=[n1:n2]; x=[(n-n0) ==0 ] 2 单位阶越序列 产生u(n) function mainImseq() clc clear d

《数字信号处理》 学习总结

21世纪属于数字化信息时代,很有幸学习了一些数字信号的基础内容,尽管还不清楚这些理论基础的应用,但他所应用的技术给了自己很多积累也让自己感受到了人类智慧的伟大,本文章主要论述对高西全和丁玉美编著的<数字信号处理>简要学习总结. 上图为对本书学习的主要内容, 信号有模拟信号,时域离散信号和数字信号之分,主要讨论的是离散信号和离散系统,为什么数字信号处理却讨论的是时域离散信号呢?原因是数字信号与离散信号的区别,数字信号存在量化误差,离散信号的特性研究相对容易. [分析方式] 任何事物都会有不同的分

数字信号处理与音频处理(使用Audition)

#include<iostream> #include<string> #include<stack> using namespace std; #define n 8 stack <int *> s; int * createMaze(){//初始化迷宫 int i,j; int * a; a=new int[n*n]; for(i=0;i<n;i++){ for(j=0;j<n;j++){ *(a+n*i+j)=-1;//不设置为0的原因是超

数字信号处理--FFT与蝶形算法

在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征.尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理.因此至DFT被发现以来,在很长的一段时间内都不能被应用到实际的工程项目中,直到一种快速的离散傅立叶计算方法——FFT,被发现,离散傅立叶变换才在实际的工程中得到广泛应用.需要强调的是,FFT并不是一种新的频域特征获取方式,而是DFT的一种快速实现算法.本文就FFT的原理以及具体实现过程进行详尽讲解. DFT计算公式 本文不