Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用delphi读取.wav文件_Delphi_Matlab_Delphi 7_Wav - Fatal编程技术网

使用delphi读取.wav文件

使用delphi读取.wav文件,delphi,matlab,delphi-7,wav,Delphi,Matlab,Delphi 7,Wav,我现在尝试使用delphi读取.wav文件。以下是我的代码: type TWaveHeader = packed record Marker_RIFF: array [0..3] of char; ChunkSize: cardinal; Marker_WAVE: array [0..3] of char; Marker_fmt: array [0..3] of char; SubChunkSize: cardinal; FormatTag

我现在尝试使用delphi读取.wav文件。以下是我的代码:

type
  TWaveHeader = packed record
    Marker_RIFF: array [0..3] of char;
    ChunkSize: cardinal;

    Marker_WAVE: array [0..3] of char;
    Marker_fmt: array [0..3] of char;
    SubChunkSize: cardinal;

    FormatTag: word;

    NumChannels: word;
    SampleRate: longint;
    BytesPerSecond: longint;
    BytesPerSample: word;
    BitsPerSample: word;


    Marker_data: array [0..3] of char;
    DataBytes: longint;
  end;

  TChannel = record
  Data : array of double;
end;
一些私人的装饰

private
    wavehdr:TWaveHeader;
    wavedata:array[0..3]of TChannel;
    numsamples:integer;
功能

  FillChar(wavehdr, sizeof(wavehdr), 0);
  Stream.Read(wavehdr, sizeof(wavehdr));

  { Log Header data }
  with memo1.Lines do begin
    Add('Filename : '+od.FileName);
    Add('Header size : '+inttostr(sizeof(wavehdr)));
    tmpstr := wavehdr.Marker_RIFF;
    Add('RIFF ID : '+tmpstr+'');
    Add('Chunk size : '+inttostr(wavehdr.ChunkSize));
    tmpstr := wavehdr.Marker_WAVE;
    Add('WAVE ID : '+tmpstr+'');
    tmpstr := wavehdr.Marker_fmt;
    Add('''fmt '' ID : '+tmpstr+''' ');
    Add('SubChunk size : '+inttostr(wavehdr.SubChunkSize));
    Add('Format : '+inttostr(wavehdr.FormatTag));
    Add('Num Channels : '+inttostr(wavehdr.NumChannels));
    Add('Sample rate : '+inttostr(wavehdr.SampleRate));
    Add('Bytes per second : '+inttostr(wavehdr.BytesPerSecond));
    Add('Bits per sample : '+inttostr(wavehdr.BitsPerSample));
    Add('Block Align : '+inttostr((wavehdr.NumChannels*wavehdr.BitsPerSample)div 8));
  end;

  numsamples := (file.size div (wavehdr.NumChannels*wavehdr.BitsPerSample)div 8) div wavehdr.BytesPerSample;
  case wavehdr.NumChannels of
      1:begin
        SetLength(wavedata[0].Data, numsamples);
        Stream.Read(wavedata[0].Data[0], numsamples);
      end;

      2:begin
        SetLength(wavedata[0].Data, numsamples);
        SetLength(wavedata[1].Data, numsamples);
        for i := 0 to high(wavedata[0].Data) do begin
          Stream.Read(wavedata[0].Data[i], 2);
          Stream.Read(wavedata[1].Data[i], 2);
        end;
      end;
  end;
以上代码提供了与MATLAB完全相同的.wav头信息和细节,即:

文件名:E:\dephi\classic3.wav RIFF-ID:RIFF 区块大小:18312354 WAVE-ID:WAVE 'fmt'ID:fmt' 子块大小:16 格式:1 PCM 频道数:2个立体声 抽样率:44100 每秒字节数:176400 每个样本位:16 块对齐:4 除了我根据wavedata-44的wavedata/blockalign的大小计算的总样本数据外,44是wav的标题。它不准确,有时会差5,1,10。我只使用了5个样本进行了测试。下面是一个示例:

classic1.wav matlab:3420288,delphimy计算:13681352/4-44=3420294 classic2.wav matlab:2912256,delphimy计算:11649204/4-44=2912257 而且matlab和delphi的样本数据值也不同

classic1.wav MATLAB:前10个值leftchannel和rightchannel

-3.05175781250000e-05[]6.103515650000E-05 -6.103515650000E-05[]6.103515650000E-05 -6.103515650000E-05[]3.05175781250000e-05 0[]-3.05175781250000e-05 6.103515650000E-05[]-6.103515650000E-05 6.103515650000E-05[]-6.103515650000E-05 3.05175781250000e-05[]-3.0517578125000E-05 6.103515650000E-05[]-6.103515650000E-05 3.05175781250000e-05[]0 -3.05175781250000e-05[]6.103515650000E-05 DELPHI:前10个值leftchannel和rightchannel

9.9015690830442E-320[]1.00265682167023E-319 9.9015690830442E-320[]9.77113627780233E-320 3.26083326255223E-322[]0 1.39677298735779E-319[]1.3708839451571E-319 1.459321698129E-319[]1.33373021094845E-319 1.23175506164681E-319[]1.206903559661E-319 1.2823967934554E-319[]1.40932225476216E-319 1.37068632125737E-319[]1.33382902407761E-319 1.33373021094845E-319[]1.2568535964555555E-319 1.40907522193924E-319[]1.33358199125469E-319 我的问题是:

在查找wav文件的总样本时,如何正确执行? matlab和delphi读取wav文件数据块的方式是否相同 不同的方式?或者我的密码是错的? 有没有一种方法可以像MATLAB那样获得相同的值? 编辑:我遵循mBo建议并将其更改为mBo建议

Data : array of SmallInt;
numsamples := wavehdr.DataBytes div (wavehdr.NumChannels * wavehdr.BitsPerSample div 8);
Stream.Read(wavedata[0].Data[i], SizeOf(SmallInt));
口译部分我不确定,但我把它改成了

floattostr(wavedata[0].Data[i]/32768.0)
floattostr(wavedata[1].Data[i]/32768.0)
我得到的结果是:

0.611602783203125 [] 0.61932373046875 0.611602783203125 [] 0.603546142578125 0.0023193359375 [] 0 0.862762451171875 [] 0.846771240234375 0.901397705078125 [] 0.823822021484375 0.760833740234375 [] 0.7454833984375 0.7921142578125 [] 0.870513916015625 0.799774169921875 [] 0.761016845703125 0.8238525390625 [] 0.782623291015625 0.354766845703125 [] 0.76123046875
每个示例的Wav文件位:16包含有符号的16位整数数据SmallInt类型,但您可以在浮点8字节双数组中读取数据

你可以申报

Data : array of SmallInt;
算计

numsamples := wavehdr.DataBytes div (wavehdr.NumChannels * wavehdr.BitsPerSample div 8);
把它们读作

Stream.Read(wavedata[0].Data[0], numsamples * SizeOf(SmallInt))
or multichannel case:
Stream.Read(wavedata[0].Data[i], SizeOf(SmallInt));
然后将数据值解释为浮点数据[i]/32768.0


请注意,matlab值3.0517578125000E-05=1/32768.0是每个样本16位信号的最小数量:16包含有符号16位整数数据SmallInt类型,但您在浮点8字节双数组中读取数据

你可以申报

Data : array of SmallInt;
算计

numsamples := wavehdr.DataBytes div (wavehdr.NumChannels * wavehdr.BitsPerSample div 8);
把它们读作

Stream.Read(wavedata[0].Data[0], numsamples * SizeOf(SmallInt))
or multichannel case:
Stream.Read(wavedata[0].Data[i], SizeOf(SmallInt));
然后将数据值解释为浮点数据[i]/32768.0


请注意,matlab值3.0517578125000E-05=1/32768.0是16位信号的最小量

在解释数据值之前,我一直遵循您的建议,我使用类似floattostrwavedata[0]。数据[i]/32768.0,但仍然得到了与matlabwew不同的结果。我的问题是,经过几次调整后,现在工作正常。非常感谢。在解释数据值之前,我一直遵循您的建议。我使用floattostrwavedata[0]。data[i]/32768.0,但仍然得到了与matlabwew不同的结果。我的问题是,经过几次调整后,现在工作正常。非常感谢你