[转载]MATLAB读取音频文件并进行音频特征提取

受教了

原文地址:MATLAB读取音频文件并进行音频特征提取 作者:愚人

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

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

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

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

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区域内的能量最大并且能量增幅最大的点作为峰值点,进行特征提取,keypoint.m文件内容如下:

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;
point.t = 0;
point.f = 0;%point结构体数组用来保存峰值点
temp.t = 0;
temp.f = 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);函数内容在caldiffenergy.m文件中,内容如下:

function diffenergy = caldiffenergy(energy)
v = diff(energy');
[x,y] = size(v);
for i = 1:y
    zero(i) = 0;
end
diffenergy = abs(([zero;v])');
end
  • 36
    点赞
  • 235
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 提取音频的共振峰需要进行一些信号处理的步骤。以下是MATLAB代码示例: ```matlab % 读取音频文件 [y, Fs] = audioread('your_audio_file.wav'); % 设置参数 frameSize = 1024; % 帧大小 hopSize = 512; % 帧移 numCoeffs = 2 + floor(Fs/1000); % LPC系数数量 nfft = 2^nextpow2(frameSize); % FFT点数 % 分帧 numFrames = floor((length(y)-frameSize)/hopSize) + 1; frames = zeros(frameSize, numFrames); for i = 1:numFrames frames(:,i) = y((i-1)*hopSize+1:(i-1)*hopSize+frameSize); end % 计算LPC系数 lpcCoeffs = zeros(numCoeffs, numFrames); for i = 1:numFrames lpcCoeffs(:,i) = lpc(frames(:,i), numCoeffs-1); end % 计算频谱包络 envelope = zeros(nfft/2+1, numFrames); for i = 1:numFrames a = lpcCoeffs(:,i); [h,f] = freqz(1, a, nfft/2+1, Fs); envelope(:,i) = abs(h).^2; end % 寻找共振峰 peaks = zeros(3, numFrames); for i = 1:numFrames [pks, locs] = findpeaks(envelope(:,i), 'SortStr','descend', 'NPeaks',3); peaks(:,i) = f(locs); end % 输出共振峰频率 disp(peaks); ``` 这段代码首先读取音频文件,并进行分帧处理。接着计算每帧的LPC系数,然后通过LPC系数计算每帧的频谱包络。最后,使用MATLAB内置函数`findpeaks`寻找频谱包络中的三个最大峰值,并输出它们的频率。请注意,此代码仅为示例,提取共振峰的结果可能因输入音频的不同而有所变化。 ### 回答2: MATLAB可以通过调用`audioread`函数来读取wav音频文件,并通过调用`resample`函数对音频进行重采样。接下来,我们可以使用MATLAB提供的数字信号处理工具箱中的`resonator`函数来提取共振峰频率。 首先,我们导入音频文件,并将其进行重采样,以确保采样率适合信号处理。假设音频文件的路径为`path_to_wav`,我们可以使用以下代码读取和重采样音频: ```matlab [y, Fs] = audioread(path_to_wav); % 读取音频文件 desiredFs = 44100; % 设定目标重采样率 y_resampled = resample(y, desiredFs, Fs); % 重采样音频 ``` 接下来,我们可以使用`resonator`函数来提取共振峰频率。该函数将音频信号作为输入参数,并返回共振器滤波器的系数和中心频率。我们可以选择使用数字滤波器的类型和阶数来调整共振峰特征的细节。以下是一个简单的示例代码,提取三个共振峰的频率: ```matlab numOfFilters = 3; % 设定共振器数量 order = 10; % 设定滤波器阶数 [R, C] = resonator(y_resampled, numOfFilters, order); % 提取共振峰 resonanceFrequencies = Fs/2 * C/(2*pi); % 计算共振峰频率 ``` 在上述代码中,我们首先使用`resonator`函数提取共振器滤波器的系数和中心频率。然后,通过将中心频率除以2π,并乘以采样率的一半,我们可以计算出共振峰的频率。 最后,`resonanceFrequencies`变量将包含提取的三个共振峰的频率。你可以根据需要对滤波器的类型和阶数进行调整,以获得所需的共振峰特征。 ### 回答3: 基于MATLAB读取wav音频文件提取三个共振峰频率的过程涉及以下几个步骤: 1. 使用MATLAB的audioread函数读取wav文件,并将音频数据保存为一个向量。 2. 对音频数据进行预处理,例如对音频信号进行归一化或者加窗处理。可以使用MATLAB的hamming窗口函数实现加窗。 3. 使用MATLAB的fft函数对加窗后的音频信号进行傅里叶变换,得到频域的信号。 4. 根据傅里叶变换的结果,通过寻找音频信号中的共振峰频率。可以使用MATLAB的findpeaks函数来寻找峰值。 5. 根据峰值的个数,选择其中三个最大的峰值作为共振峰频率。 6. 使用MATLAB的plot函数将频率和幅度值绘制成图形,便于可视化。 以下是一个简单的MATLAB代码示例: ```matlab % Step 1: 读取wav文件 [x, fs] = audioread('audio.wav'); % Step 2: 加窗处理 window = hamming(length(x)); x = x .* window; % Step 3: 进行FFT,得到频域信号 X = fft(x); % Step 4: 寻找峰值 [pks,locs] = findpeaks(abs(X)); % Step 5: 选择三个最大的峰值作为共振峰频率 [~, index] = sort(pks, 'descend'); resonancefreq = sort(locs(index(1:3))); % Step 6: 绘制频率和幅度图 frequencies = resonancefreq * fs / length(x); figure; plot(frequencies, pks(index(1:3))); xlabel('Frequency (Hz)'); ylabel('Amplitude'); title('Resonance Frequencies'); ``` 通过上述步骤,我们可以基于MATLAB读取wav音频文件提取三个共振峰频率。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值