wavwr.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. function wavwri(waveData,sRate,res,nchannel,wavefile,user_limit)
  2. %WAVWRI Saves Microsoft Windows .WAV format sound files.
  3. %   WAVWRI(y,Fs,res,nchannel,wavefile,user_limit) saves a .WAV format file.
  4. %
  5. %   The input arguments for WAVWRITE are as follows:
  6. %
  7. %       y           The sampled data to save
  8. %       Fs          The rate at which the data was sampled
  9. %       res         Resulution, 8 or 16 (bits/sample)
  10. %       nchannel    Number of channels, 1 or 2
  11. %       wavefile    A string containing the name of the .WAV file to create
  12. %       user_limit  OPTIONAL: if supplied, the data will be treated as if it had
  13. %                   maximum magnitude of user_limit.  Otherwise the data will be
  14. %                   scaled so that its actual maximum magnitude goes to full scale.
  15. %                   So, if you want the actual values of your data to appear in the
  16. %                   WAV file, despite the fact that the max. mag. of your data may
  17. %                   not be full scale, for 16-bit you would supply a user_limit of
  18. %                   32767.
  19. if (nargin~=5 & nargin~=6)
  20.    error(['WAVWRI needs 5 or 6 arguments, got ' int2str(nargin)]);
  21. end
  22. limit=max(max(abs(waveData)));
  23. if nargin==6
  24.    if limit <= user_limit
  25.       limit = user_limit;
  26.    else
  27.       error(['a limit of ' num2str(user_limit) ' was passed in but actual limit is ' num2str(limit)]);
  28.    end;
  29. end;
  30. waveData=waveData/limit*(2^(res-1) - 1);
  31. if res==8 waveData=waveData+128; end;
  32. fid=fopen(wavefile,'wb','l');
  33. if fid ~= -1
  34.         [m,n]=size(waveData);
  35.         nsamples=m*n;
  36.         fac=res/8;
  37.         riffsize=36+nsamples*fac;
  38.         % write riff chunk
  39.         fwrite(fid,'RIFF','uchar');
  40.         fwrite(fid,riffsize,'ulong');
  41.         fwrite(fid,'WAVE','uchar');
  42.         % write format sub-chunk
  43.         fwrite(fid,'fmt ','uchar');
  44.         fwrite(fid,16,'ulong');
  45.         fwrite(fid,1,'ushort');         % PCM format
  46.         fwrite(fid,nchannel,'ushort');  % 1 or 2 channel
  47.         fwrite(fid,sRate,'ulong');      % samples per second
  48.         fwrite(fid,fac*sRate*nchannel,'ulong');  % average bytes per second
  49.         fwrite(fid,fac*nchannel,'ushort');       % block alignment
  50.         fwrite(fid,fac*8,'ushort');     % bits per sample
  51.         % write data sub-chunck
  52.         fwrite(fid,'data','uchar');
  53.         fwrite(fid,nsamples*fac,'ulong');
  54.         
  55.         if nchannel==2 waveData=waveData(:);  end;   % Wenn Stereo
  56.         
  57.         if fac==2
  58.            fwrite(fid,waveData,'ushort');   % 16 bit
  59.         else
  60.            fwrite(fid,waveData,'uchar');    %  8 bit
  61.         end;
  62.         fclose(fid);
  63. else
  64. error(['Can''t open .WAV file ' wavefile ' for output!']);
  65. end;