北大心理学系.利用Matlab生成听觉刺激教程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
component(i, :) = amplitude * sin(2*pi*(f0*i)*t); amplitude = amplitude/2; end complex = sum(component); complex = complex/max(abs(complex)); figure plot(complex(1:441))
二、用 Matlab 产生纯音、噪音、乐音和复合音(和音)
示例 5.1 生成纯音,生成一段单声道纯音就是生成一列正弦波,sf = 44100(采样率),t = 1.5 秒(持续时长),f = 261.6 纯音频率(C4 = 261.6Hz).
tmp = linspace(0, t, sf*t); % 计算正弦用的采样矩阵 tone = sin(2 * pi * f * tmp); % 产生声音向量 wavplay(tone, sf) % 播放声音 plot(tone(1:200))
第五章 利用 Matlab 生成听觉刺激
【内容提要】
1. 声音的特性; 2. 用 Matlab 产生纯音、噪音、乐音和复合音(和音) 3. 构造声音的移动; 4. 声音的淡入和淡出; 5. 声音的其它处理(滤波和声场分析)
一、声音的特性
如前一章提到的,Psychtoolbox 是一组 Matlab 函数(M 文件)和用 C 语言写的可执行的 mex 文件构成,这使得我们非常方便去定制心理学实验所需要的刺激事件。利用 Matlab 和 Psychtoolbox 工具包,我们也能方便地产生各种类型的声音(包括噪音),复杂和虚拟的声 场,并可以对声音的频谱特性进行修饰,以符合心理学实验的需要。
和声(Harmony)是关于乐音音频同时性(也包括续时性)分布自然法则描述、总结性学科,
对于理解音乐构成及其自然逻辑意义有着重要的作用。
图 2 和声频谱示意图
大三和弦由三个不同频率的声音组成,而这三个频率的比例接近 6:5:4.在音响(sound)的 范畴里,广义的和声(harmony)可以是指任何由超过一个频率所组合而成的声音。但在西 方音乐里面,和声也常常用来描述不同和弦(chord)的配搭手法,而和弦则通常较为狭义 地描述同一时间演奏两个或以上不同音高,但这两个词语在许多时候可以通用。和声和旋律 (melody)的分别是,旋律是指在不同的时间演奏不同的音高。和声学通常是研究如何在同 一时间演奏不同的音高而获得协调或不协调的效果,而对位法则是研究如何在同一时间结合 两个不同的旋律。在音乐史上不同的时期对和声学以及对位法都有不同的理解,对于何谓协 调或者不协调的看法,随着时代不断改变。
指定async参数可以使声音在“后台”播放
否则wavplay会等待播完,然后才执行下一句
利用async可以“叠加”两个声音 wavplay(wav, 44100, 'async')
sr = 44100; f = 500; d = 1; t = linspace(0, d, sr*d); tone = sin(2*pi*f*t); softer_tone = tone * 10^(-10/20);
示例 5.8 声强的归一化
load train s1 = y; load chirp s2 = y; rms_s1 = sqrt(mean(s1.^2)); rms_s2 = sqrt(mean(s2.^2)); rms_ratio = rms_s1/rms_s2; if rms_ratio > 1
示例5.6 读取和写入声音文件以及异步播放
用 Matlab 读取并播放声音的函数格式
[wav, sf, nbits] = wavread('sound.wav'); size(wav) t = size(wav,1)/sf % 时长 = 采样点个数/采样率 wavplay(wav, sf)
写入声音
wavwrite(wav, sf, nbits, 'sound.wav'); “异步”播放
观点来看,上述声压造成的压强变化很小,但若频率在声频内,此此音却是震耳欲聋,可能
会造成听力损害的程度。由于人耳可以传感的声音振幅范围较广,声压一般会表示为对数尺
度,以分贝表示的声压级(SPL)来表示。声压级(SPL)可以用 L 表示.定义如下:
其中,p 为声压的均方根值, 为参考声压,一般用的参考声压是以 ANSI S1.1-1994 为 准,在空气中为 20 µPa,在水中为 1 µPa。若没有指定的参考声压,只有一个以分贝值表 示的数值不能代表声压级。数字音频中,0dB 是最大的音量,在此基础上可以减小音量,如 -10dB。
plot(noise(1:200))
1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
0 0
20 40
60 80 100 120 140 160 180 200
图 4 噪声的信号示意图
示例 5.4 播放乐音 do, re, mi,do
sr = 44100; d = .5; f_do = 261.6; f_re = 293.6; f_mi = 329.6; t = linspace(0, d, sr*d); do = sin(2*pi*f_do*t); re = sin(2*pi*f_re*t); mi = sin(2*pi*f_mi*t); silence = zeros(1, sr*d); soundsc([do, re, mi, silence, do], sr);
1 0.8 0.6 0.4 0.2
0 -0.2 -0.4 -0.6 -0.8
-1 0
20
40
60
80 100 120 140 160 180 200
图 3 纯音的信号(正弦波)示意图
示例 5.2 生成纯音
sr = 44100;
% 采样频率
f = 1000; % 声音频率 d = 1; %时间长度 t = linspace(0, d, sr*d); %时间向量 tone = sin(2*pi*f*t); % 声音数据 sound(tone, sr);%播放声音
示例5.5 产生复合音
sr = 44100; f1 = 200; f2 = 250; f3 = 380;
d = 1; t = linspace(0, d, sr*d); first_component = sin(2*pi*f1*t); second_component = sin(2*pi*f2*t); third_component = sin(2*pi*f3*t); inharmonic = first_component + second_component + third_component; soundsc(inharmonic, sr);
sr = 44100; f0 = 250; d = 1; t = linspace(0, d, sr*d); first_component = sin(2*pi*f0*t); second_component = 1/2 * sin(2*pi*(f0*2)*t); third_component = 1/4* sin(2*pi*(f0*3)*t); complex = first_component + second_component + third_component; plot(complex(1:441))
示例 5.3 生成噪声
生成一段单声道噪音就是生成一列随机数,比如 sf = 44100( 采样率),t = 1.5 秒( 持续时 长),noise = rand(sf*t, 1)为产生噪声的数据向量,wavplay(noise, sf)为播放声音。
sr = 44100; d = 1; noise = rand(1, round(sr*d)); noise = noise*2; noise = noise-1; sound(noise, sr)
在介绍具体的方法之前,先对声音的基本特性要有清晰的认识。对于一个以正弦波或与余弦 波为基础的纯音,它包含四个要件:声音的时长、频率、采样率和比特率。赫兹是频率单位, 记为 Hz,指每秒钟周期性变化的次数。分贝是用来表示声音强度的单位,记为 dB。声音是 一种波,我们以极短的时间间隔把波形变成一系列的数字,也就是模拟信号到数字信号的转 换,简称 A/D 转换,就是对声音进行采样,每秒钟采样的次数称为采样频率。声音的采样率 与声卡的缓存容量有关。常用的采样频率有 11.025kHz、22.05kHz 和 44.1kHz。在采样时, 采样点之间的时间间隔越小,即每秒钟采样的次数越多,采样频率越大,采样就越细腻逼真, 所以理论上讲应该是采样频率越高音质越好。但由于人耳听觉分辨率毕竟有限,最大分辨率 大约是 20kHz 左右。比特率则表示记录音频数据每秒钟所需要的平均比特值,比特是计算机 中最小的数据单位,指一个 0 或者 1 的数,通常我们使用 Kbps(1024bps)作为单位。CD 中的数字音乐比特率为 1411.2Kbps,也就是记录 1 秒钟的 CD 音乐,需要 1411.2×1024 比 特的数据,对于大部分人来说,192Kbps 的 MP3 音质已经非常不错了,但是如果你的耳朵比 较灵敏,自然要求也就相应提高。目前大部分 MP3 播放机所能够支持的 256Kbps 的比特率, 基本上已经能够满足要求了,如果能够支持更高当然更好。影响声音的大小的物理要素是振 幅,电脑上的声音必须也要能精确表示乐曲的轻响,所以一定要对声波的振幅有一个精确的 描述比特”就是这样一个单位,x 比特就是指把波形的振幅划为 2 的 x 次方个等级,根据模
if ispc wavplay(tone, sr, 'sync'); wavplay(softer_tone, sr);
elseif ismac sound(tone, sr); sound(softer_tone, sr);
end
声音的正则化
在一般的情况下,声音序列数据的数值不超过1。但在声音数据变换操作时,声音数据的振 幅有可能超出1的范围。因此,在声音信号内部数据造成不一致,播放时影响了声音的真实 精度。为此,需要对声音信号进行正则化。另外,当声音的主观知觉强度不一致时,也需要 进行正则化,然后针对正则去,就可以用数字来表示了。比特率越高,越能细致地 反映声音的轻响变化。为了体现正常的声音信息,16bit 为基本的需求,较好的 cd 使用的 是 20bit 甚至 24bit。
图 1 4 比特的声音采样示意图 声音总可以被分解为不同频率不同强度正弦波的叠加。这种变换(或分解)的过程,称为傅 里叶变换。因此,一般的声音总是包含一定的频率范围。人耳可以听到的声音的频率范围在 20 到 2 万赫兹(Hz)之间。高于这个范围的波动称为超声波,而低于这一范围的称为次声 波。 音阶是按照特定规律,将音高顺次排列的一组音列。音阶的概念可以追溯至中古时代的素歌 的调式,用以突出乐曲的某种特质或音质,后来经过不断的演变,使音阶的概念逐步确立。 一般人较常认识的音阶有大调音阶和小调音阶。都是根据特定的排列方式所制造出来的,不 过,大、小二调亦可以通过把次序的先后改变,变成了新的音阶变种,而这类变种亦富有古 代调式的元素在内。各种较常见的音阶包括半音音阶、八声音阶、七声音阶、六声音阶、五 声音阶、爵士音阶等。
表征声音强度的一个单位为声压。特定介质下的声压是指是指声波通过某种媒质时,由振动
所产生的压强改变量,一般会考虑在不同时间或空间下,声压的均方根(RMS)为其平均值。
例如空气中声压均方根为 1Pa(94dbSPL)的声音,表示其实际的压强会在(1 atm
Pa)
及(1 atm
Pa)之间变化,即在 101323.6Pa 及 101326.4 Pa 之间变化。若以压强的
正则化处理的一个常用命令是soundsc, 这里的后缀名sc为scale的缩写。soundsc的用途在 于将声音序列数据以整体的平均数为分母,逐一将每个数据点除以平均值,归一化为小于1。 也可参考以下示例5.7的例子
示例5.7 声音的归一化
f0=250; amplitude = 1; for i = 1:20
二、用 Matlab 产生纯音、噪音、乐音和复合音(和音)
示例 5.1 生成纯音,生成一段单声道纯音就是生成一列正弦波,sf = 44100(采样率),t = 1.5 秒(持续时长),f = 261.6 纯音频率(C4 = 261.6Hz).
tmp = linspace(0, t, sf*t); % 计算正弦用的采样矩阵 tone = sin(2 * pi * f * tmp); % 产生声音向量 wavplay(tone, sf) % 播放声音 plot(tone(1:200))
第五章 利用 Matlab 生成听觉刺激
【内容提要】
1. 声音的特性; 2. 用 Matlab 产生纯音、噪音、乐音和复合音(和音) 3. 构造声音的移动; 4. 声音的淡入和淡出; 5. 声音的其它处理(滤波和声场分析)
一、声音的特性
如前一章提到的,Psychtoolbox 是一组 Matlab 函数(M 文件)和用 C 语言写的可执行的 mex 文件构成,这使得我们非常方便去定制心理学实验所需要的刺激事件。利用 Matlab 和 Psychtoolbox 工具包,我们也能方便地产生各种类型的声音(包括噪音),复杂和虚拟的声 场,并可以对声音的频谱特性进行修饰,以符合心理学实验的需要。
和声(Harmony)是关于乐音音频同时性(也包括续时性)分布自然法则描述、总结性学科,
对于理解音乐构成及其自然逻辑意义有着重要的作用。
图 2 和声频谱示意图
大三和弦由三个不同频率的声音组成,而这三个频率的比例接近 6:5:4.在音响(sound)的 范畴里,广义的和声(harmony)可以是指任何由超过一个频率所组合而成的声音。但在西 方音乐里面,和声也常常用来描述不同和弦(chord)的配搭手法,而和弦则通常较为狭义 地描述同一时间演奏两个或以上不同音高,但这两个词语在许多时候可以通用。和声和旋律 (melody)的分别是,旋律是指在不同的时间演奏不同的音高。和声学通常是研究如何在同 一时间演奏不同的音高而获得协调或不协调的效果,而对位法则是研究如何在同一时间结合 两个不同的旋律。在音乐史上不同的时期对和声学以及对位法都有不同的理解,对于何谓协 调或者不协调的看法,随着时代不断改变。
指定async参数可以使声音在“后台”播放
否则wavplay会等待播完,然后才执行下一句
利用async可以“叠加”两个声音 wavplay(wav, 44100, 'async')
sr = 44100; f = 500; d = 1; t = linspace(0, d, sr*d); tone = sin(2*pi*f*t); softer_tone = tone * 10^(-10/20);
示例 5.8 声强的归一化
load train s1 = y; load chirp s2 = y; rms_s1 = sqrt(mean(s1.^2)); rms_s2 = sqrt(mean(s2.^2)); rms_ratio = rms_s1/rms_s2; if rms_ratio > 1
示例5.6 读取和写入声音文件以及异步播放
用 Matlab 读取并播放声音的函数格式
[wav, sf, nbits] = wavread('sound.wav'); size(wav) t = size(wav,1)/sf % 时长 = 采样点个数/采样率 wavplay(wav, sf)
写入声音
wavwrite(wav, sf, nbits, 'sound.wav'); “异步”播放
观点来看,上述声压造成的压强变化很小,但若频率在声频内,此此音却是震耳欲聋,可能
会造成听力损害的程度。由于人耳可以传感的声音振幅范围较广,声压一般会表示为对数尺
度,以分贝表示的声压级(SPL)来表示。声压级(SPL)可以用 L 表示.定义如下:
其中,p 为声压的均方根值, 为参考声压,一般用的参考声压是以 ANSI S1.1-1994 为 准,在空气中为 20 µPa,在水中为 1 µPa。若没有指定的参考声压,只有一个以分贝值表 示的数值不能代表声压级。数字音频中,0dB 是最大的音量,在此基础上可以减小音量,如 -10dB。
plot(noise(1:200))
1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
0 0
20 40
60 80 100 120 140 160 180 200
图 4 噪声的信号示意图
示例 5.4 播放乐音 do, re, mi,do
sr = 44100; d = .5; f_do = 261.6; f_re = 293.6; f_mi = 329.6; t = linspace(0, d, sr*d); do = sin(2*pi*f_do*t); re = sin(2*pi*f_re*t); mi = sin(2*pi*f_mi*t); silence = zeros(1, sr*d); soundsc([do, re, mi, silence, do], sr);
1 0.8 0.6 0.4 0.2
0 -0.2 -0.4 -0.6 -0.8
-1 0
20
40
60
80 100 120 140 160 180 200
图 3 纯音的信号(正弦波)示意图
示例 5.2 生成纯音
sr = 44100;
% 采样频率
f = 1000; % 声音频率 d = 1; %时间长度 t = linspace(0, d, sr*d); %时间向量 tone = sin(2*pi*f*t); % 声音数据 sound(tone, sr);%播放声音
示例5.5 产生复合音
sr = 44100; f1 = 200; f2 = 250; f3 = 380;
d = 1; t = linspace(0, d, sr*d); first_component = sin(2*pi*f1*t); second_component = sin(2*pi*f2*t); third_component = sin(2*pi*f3*t); inharmonic = first_component + second_component + third_component; soundsc(inharmonic, sr);
sr = 44100; f0 = 250; d = 1; t = linspace(0, d, sr*d); first_component = sin(2*pi*f0*t); second_component = 1/2 * sin(2*pi*(f0*2)*t); third_component = 1/4* sin(2*pi*(f0*3)*t); complex = first_component + second_component + third_component; plot(complex(1:441))
示例 5.3 生成噪声
生成一段单声道噪音就是生成一列随机数,比如 sf = 44100( 采样率),t = 1.5 秒( 持续时 长),noise = rand(sf*t, 1)为产生噪声的数据向量,wavplay(noise, sf)为播放声音。
sr = 44100; d = 1; noise = rand(1, round(sr*d)); noise = noise*2; noise = noise-1; sound(noise, sr)
在介绍具体的方法之前,先对声音的基本特性要有清晰的认识。对于一个以正弦波或与余弦 波为基础的纯音,它包含四个要件:声音的时长、频率、采样率和比特率。赫兹是频率单位, 记为 Hz,指每秒钟周期性变化的次数。分贝是用来表示声音强度的单位,记为 dB。声音是 一种波,我们以极短的时间间隔把波形变成一系列的数字,也就是模拟信号到数字信号的转 换,简称 A/D 转换,就是对声音进行采样,每秒钟采样的次数称为采样频率。声音的采样率 与声卡的缓存容量有关。常用的采样频率有 11.025kHz、22.05kHz 和 44.1kHz。在采样时, 采样点之间的时间间隔越小,即每秒钟采样的次数越多,采样频率越大,采样就越细腻逼真, 所以理论上讲应该是采样频率越高音质越好。但由于人耳听觉分辨率毕竟有限,最大分辨率 大约是 20kHz 左右。比特率则表示记录音频数据每秒钟所需要的平均比特值,比特是计算机 中最小的数据单位,指一个 0 或者 1 的数,通常我们使用 Kbps(1024bps)作为单位。CD 中的数字音乐比特率为 1411.2Kbps,也就是记录 1 秒钟的 CD 音乐,需要 1411.2×1024 比 特的数据,对于大部分人来说,192Kbps 的 MP3 音质已经非常不错了,但是如果你的耳朵比 较灵敏,自然要求也就相应提高。目前大部分 MP3 播放机所能够支持的 256Kbps 的比特率, 基本上已经能够满足要求了,如果能够支持更高当然更好。影响声音的大小的物理要素是振 幅,电脑上的声音必须也要能精确表示乐曲的轻响,所以一定要对声波的振幅有一个精确的 描述比特”就是这样一个单位,x 比特就是指把波形的振幅划为 2 的 x 次方个等级,根据模
if ispc wavplay(tone, sr, 'sync'); wavplay(softer_tone, sr);
elseif ismac sound(tone, sr); sound(softer_tone, sr);
end
声音的正则化
在一般的情况下,声音序列数据的数值不超过1。但在声音数据变换操作时,声音数据的振 幅有可能超出1的范围。因此,在声音信号内部数据造成不一致,播放时影响了声音的真实 精度。为此,需要对声音信号进行正则化。另外,当声音的主观知觉强度不一致时,也需要 进行正则化,然后针对正则去,就可以用数字来表示了。比特率越高,越能细致地 反映声音的轻响变化。为了体现正常的声音信息,16bit 为基本的需求,较好的 cd 使用的 是 20bit 甚至 24bit。
图 1 4 比特的声音采样示意图 声音总可以被分解为不同频率不同强度正弦波的叠加。这种变换(或分解)的过程,称为傅 里叶变换。因此,一般的声音总是包含一定的频率范围。人耳可以听到的声音的频率范围在 20 到 2 万赫兹(Hz)之间。高于这个范围的波动称为超声波,而低于这一范围的称为次声 波。 音阶是按照特定规律,将音高顺次排列的一组音列。音阶的概念可以追溯至中古时代的素歌 的调式,用以突出乐曲的某种特质或音质,后来经过不断的演变,使音阶的概念逐步确立。 一般人较常认识的音阶有大调音阶和小调音阶。都是根据特定的排列方式所制造出来的,不 过,大、小二调亦可以通过把次序的先后改变,变成了新的音阶变种,而这类变种亦富有古 代调式的元素在内。各种较常见的音阶包括半音音阶、八声音阶、七声音阶、六声音阶、五 声音阶、爵士音阶等。
表征声音强度的一个单位为声压。特定介质下的声压是指是指声波通过某种媒质时,由振动
所产生的压强改变量,一般会考虑在不同时间或空间下,声压的均方根(RMS)为其平均值。
例如空气中声压均方根为 1Pa(94dbSPL)的声音,表示其实际的压强会在(1 atm
Pa)
及(1 atm
Pa)之间变化,即在 101323.6Pa 及 101326.4 Pa 之间变化。若以压强的
正则化处理的一个常用命令是soundsc, 这里的后缀名sc为scale的缩写。soundsc的用途在 于将声音序列数据以整体的平均数为分母,逐一将每个数据点除以平均值,归一化为小于1。 也可参考以下示例5.7的例子
示例5.7 声音的归一化
f0=250; amplitude = 1; for i = 1:20