matlab语句什么意思?

matlab语句什么意思?,第1张

[x,fs]=wavread(‘1wav’);句中的的[x,fs]用于存储wavread函数返回的采样数据和采样率,sound语句里面(x,fs)是sound函数的输入参数,同wavread函数获取的两个参数。x(:,1)中的冒号代表所有行索引,x(:,1)表示x矩阵的第1列。

  1、用audioread('');函数读取电脑中的音频文件,参数是音频文件的路径:

  [sampledata,FS] = audioread('F:1mp3');

  sampledata保存音频信号数据,FS是音频采样率,MP3格式的采样率一般为44100;

  2、判断音频数据是否是双声道,如果是双声道则保留一个声道的数据,用calsamplem文件的函数完成此功能,文件内容如下:

  function sample = calsample(sampledata,FS)

  temp_sample = resample(sampledata,1,FS/11025);

  [m,n] = size(temp_sample);

  if (n == 2)

  sample = temp_sample(:,1);

  else

  sample = temp_sample;

  end

  end

  3、对音频数据进行快速傅里叶变换得到频谱图,并选取scope区域内的能量最大并且能量增幅最大的点作为峰值点,进行特征提取,keypointm文件内容如下:

  function point = keypoint(sample,scope)

  %对音频数据进行快速傅里叶变换,得到变换后的数据为b,频率为f,时间为t

  [b,f,t] = specgram(sample,1024,11025,hanning(1024),256);

  specgram(sample,1024,11025,hanning(1024),256);%绘制频谱图

  hold on;

  energy = abs(b);%根据快速傅里叶变换后的数据进行能量计算

  %energy = sample;

  diffenergy = caldiffenergy(energy);%计算能量差分

  [m,n] = size(energy);%获取能量矩阵的大小

  %f = (0:4);

  %t = (0:4);

  f_unit = max(f)/(length(f)-1);%根据频率点个数计算频率单位长度

  t_unit = max(t)/(length(t)-1);%根据时间点个数计算时间单位长度

  k = 1;

  l = 1;

  p = 1;

  num = 1;

  pointt = 0;

  pointf = 0;%point结构体数组用来保存峰值点

  tempt = 0;

  tempf = 0;%temp结构体数组用来保存计算中的临时点

  count = 0;%count为零表示在当前scope中未找到峰值点

  x_f=0;

  y_t=0;

  plot(x_f,y_t);

  hold on;

  for i = 1:m-scope+1

  for j = 1:n-scope+1

  %找出大小为scope的子矩阵中的最大元素的位置并保存

  [x_f,y_t] = find(energy(i:i+scope-1,j:j+scope-1)==max(max(energy(i:i+scope-1,j:j+scope-1))));

  x_f = x_f + i - 1;

  y_t = y_t + j - 1;

  %找出大小为scope的子矩阵中的差分最大元素的位置并保存

  [diffx,diffy] = find(diffenergy(i:i+scope-1,j:j+scope-1)==max(max(diffenergy(i:i+scope-1,j:j+scope-1))));

  diffx = diffx + i - 1;

  diffy = diffy + j - 1;

  count = 0;

  %如果最大元素和差分最大元素都为同一个位置则该点为峰值点,保存在temp中

  for k = 1:length(x_f)

  for l = 1:length(diffx)

  if (x_f(k) == diffx(l)) && (y_t(k) == diffy(l))

  temp(num)f = x_f(k) f_unit;

  temp(num)t = y_t(k) t_unit;

  %plot(temp(num)t,temp(num)f,'');

  num = num + 1;

  count = 1;%在scope中找到一个峰值点则不再记录其它相同的点

  break;

  end

  end

  if count == 1%scope中多个峰值点只保留第一个

  break;

  end

  end

  end

  end

  %将temp中保存的峰值点画在图上,多个scope中找到的相同峰值点只画一次

  len = 1;

  point(1)f = temp(1)f;

  point(1)t = temp(1)t;

  plot(point(1)t,point(1)f,'');

  for i = 2:num - 1

  for j = 1:len

  if (temp(i)f == point(j)f) && (temp(i)t == point(j)t)

  break;

  end

  end

  if j == len && (temp(i)f ~= point(j)f) && (temp(i)t ~= point(j)t)

  len = len + 1;

  point(len)f = temp(i)f;

  point(len)t = temp(i)t;

  plot(point(len)t,point(len)f,'');

  end

  end

  hold off

  end

  4、keypoint(sample,scope);函数中用到的caldiffenergy(energy);函数内容在caldiffenergym文件中,内容如下:

  function diffenergy = caldiffenergy(energy)

  v = diff(energy');

  [x,y] = size(v);

  for i = 1:y

  zero(i) = 0;

  end

  diffenergy = abs(([zero;v])');

  end

大至流程:

wavread函数读入后,

用fft做频谱分析,

把频谱移动300->100,

再ifft还原语音信号,

sound播放

或者写入wav文件用专用的播放器播放

在matlab中,可以用wavread函数来打开wav格式的声音文件。

wavread函数的用法如下:

1、y

=

wavread(filename)

%

输入参数filename为指定载入的音频文件名称,为单引号引出的字符串形式。返回参数y%

%

为所读取的音频数据样本。当文件无扩展名时,系统自动附加扩展名wav。

2、[y,

fs,

nbits]

=

wavread(filename)

%

参数filename、y的定义同上,fs为采样频率,nbits为文件中每个样本的字节数。

3、[]

=

wavread(filename,

n)

%

参数n为文件每个通道的前n个样本。

4、[]

=

wavread(filename,[n1

n2])

%

参数n1、n2为文件每个通道从n1到n2的样本。

举例说明如下:

[y,fs,nbits]=

wavread('d:\shuidaosoundwav');

sound(x,fs,bits);

%

播放声音

%

y就是音频信号;

%

fs是采样频率,比如说16000就是每秒16000次;

%

nbit是采样精度,比如说16就是指16位精度的采样。

程序如下。(记得带耳机听)附件中有完整m程序,能够实现声音以及显示信号波形

Fs=100;%频率要设成80-10000之间就行

x=0:pi/Fs:500pi;

y=sin(x);

save('ymat','y','-mat')

load ymat

sound(y,2Fs)%输出正弦信号声音

MATLAB里函数audioread的使用格式:

[y,Fs]=audioread('D:\MATLAB\work\noisymusicwav');

sound(y,Fs);

你的写法没有问题。你可以查看wav文件的属性是不是这样的?

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12177581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存