2015-05-11 26 views
0

我希望从.wav格式分析matlab中的长音频文件,并将整个长度的音频导出为2048x2048像素位图的谱图。对于一秒钟的声音,我想要自动化大约20个位图,并且我想让matlab在几个小时的过程中处理并返回1000个长位音频的位图,然后在另一个程序中进一步处理。作为批处理位图,我可以在Matlab中保存很多图吗?

初学者可能吗?

回答

2

这里一个旧的SciLab实现让你开始。我建议将结果谱图保存为数据,而不是图像。并写另一个可以将数据转换为图像的功能。

// For simple plotting, Positions in Milliseconds!! 
function plotASpectrogram(source, startPosition, endPosition) 

    [audio,sampleRate] = wavread(source); 

    startPosition = msecToSamples(startPosition, sampleRate); 
    endPosition = msecToSamples(endPosition, sampleRate); 

    audio = cropAudio(audio, startPosition, endPosition); 

    mapsound(audio);//,.1,100,2000,1,sampleRate); 

    //Label axes 
    startPosition = samplesToMsec(startPosition, sampleRate); 

    if(startPosition==0) 
    startPosition = ""; 
    else 
    startPosition = " + " + string(startPosition/1000); 
    end  

    labelTheAxes("", "", "Spec " + string(getNameFromSource(source))); 
endfunction 

// Create a linear spectrogram 
// parameter [in] audio - audio file read in with wavread 
// parameter [in] specFreqSamples - number of frequencies 
// parameter [in] specTimeSamples - number of time samples 
// parameter [in] specOverlap - amount of overlap in spectrogram windows 
// parameter [in] hann - precalculated hanning window for smoothing 
// parameter [out] tempSpec - A matrix containing the spectrogram 
function tempSpec = createLinearSpectrogram(audio, specFreqSamples, specTimeSamples, specOverlap, hann) 

    //Allocate memory for the input and output arrays. 
    tempSpec = zeros(St,specFreqSamples); 
    in  = zeros(specTimeSamples); //The input will have real values, 
    out  = zeros(specFreqSamples,2); //While the output will have complex values.It is also 1/2 the length of the input array +1. 

    for i = 1:St 
    //Store the input data into the input array 
    for j = 1:specTimeSamples 
     in(j) = audio(1,(i-1) * specTimeSamples/specOverlap + j); 
     in(j) = in(j) * hann(j); 
    end 

    //Execute the FFT 
    out(1:specTimeSamples,1) = real(fftw(in(1:specTimeSamples),1)); 
    out(1:specTimeSamples,2) = imag(fftw(in(1:specTimeSamples),1)); 

    //Convert the output into complex data and calculate the absolute value of every 
    //output. Store it into the spectrogram array. 
    for j = 1:specFreqSamples 
     tempSpec(i,j) = sqrt(out(j,1) * out(j,1) + out(j,2) * out(j,2)); 
    end  
    end 
endfunction 

// Some utility functions 
function labelTheAxes(Title, LabelX, LabelY) 

    a=get("current_axes"); 
    a.x_label; 
    a.y_label; 
    xtitle(string(Title),string(LabelX), string(LabelY)); 

endfunction 

function numberOfSamples = msecToSamples(numberOfMilliSeconds, sampleRate) 
    numberOfSamples = round((numberOfMilliSeconds/1000) * sampleRate); 
endfunction 

function croppedAudio = cropAudio(audio, startPosition, endPosition) 
    //Parameters in Samples!!! 
    croppedAudio = audio(1,startPosition:endPosition); 
endfunction 
1

你应该使用命令print

fig = figure(); 
%Plot some data 
print (fig, '-noui', '-dbmp', 'myfile.bmp'); 

我建议你尝试PNG(png),而不是BMP,你可以节省一些内存(或使用256个值对bmp bmp256

+0

要小心'png'图像,因为它们是有损的,可能会改变你的结果。 – spoorcc

相关问题