[英]sound wave sawtooth in c
我正試圖在c中產生鋸齒波。 我已經接近我的工作,但我有一個必須解決的問題。 我在下面附上了clode。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <tgmath.h>
/******************************
* Magic file format strings. *
******************************/
const char fChunkID[] = {'R', 'I', 'F', 'F'};
const char fFormat[] = {'W', 'A', 'V', 'E'};
const char fSubchunk1ID[] = {'f', 'm', 't', ' '};
const char fSubchunk2ID[] = {'d', 'a', 't', 'a'};
/********************************
* WriteWavePCM() configuration: *
* - 2 channels, *
* - frequency 44100 Hz. *
********************************/
const unsigned short N_CHANNELS = 2;
const unsigned int SAMPLE_RATE = 48000;
const unsigned short BITS_PER_BYTE = 8;
bool WriteWavePCM(short* sound, size_t pairAmount, char* fileName){
const static unsigned int fSubchunk1Size = 16;
const static unsigned short fAudioFormat = 1;
const static unsigned short fBitsPerSample = 16;
unsigned int fByteRate = SAMPLE_RATE * N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;
unsigned short fBlockAlign = N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;
unsigned int fSubchunk2Size;
unsigned int fChunkSize;
FILE* fout;
size_t ws;
if (!sound || !fileName || !(fout = fopen( fileName, "w" ))) return false;
fSubchunk2Size = pairAmount * N_CHANNELS * fBitsPerSample / BITS_PER_BYTE;
fChunkSize = 36 + fSubchunk2Size;
// Writing the RIFF header:
fwrite(&fChunkID, 1, sizeof(fChunkID), fout);
fwrite(&fChunkSize, sizeof(fChunkSize), 1, fout);
fwrite(&fFormat, 1, sizeof(fFormat), fout);
// "fmt" chunk:
fwrite(&fSubchunk1ID, 1, sizeof(fSubchunk1ID), fout);
fwrite(&fSubchunk1Size, sizeof(fSubchunk1Size), 1, fout);
fwrite(&fAudioFormat, sizeof(fAudioFormat), 1, fout);
fwrite(&N_CHANNELS, sizeof(N_CHANNELS), 1, fout);
fwrite(&SAMPLE_RATE, sizeof(SAMPLE_RATE), 1, fout);
fwrite(&fByteRate, sizeof(fByteRate), 1, fout);
fwrite(&fBlockAlign, sizeof(fBlockAlign), 1, fout);
fwrite(&fBitsPerSample, sizeof(fBitsPerSample), 1, fout);
/* "data" chunk: */
fwrite(&fSubchunk2ID, 1, sizeof(fSubchunk2ID), fout);
fwrite(&fSubchunk2Size, sizeof(fSubchunk2Size), 1, fout);
/* sound data: */
ws = fwrite(sound, sizeof(short), pairAmount * N_CHANNELS, fout);
fclose(fout);
return true;
}
////////////////////////////////////////////////
const unsigned int N_SAMPLE_PAIRS = 50000;
int main(int argc, char* argv[]){
short* sound;
int i;
int j;
bool status;
char* file_name;
int l; // dodane
sound = (int*) malloc(sizeof(int) * N_SAMPLE_PAIRS * N_CHANNELS );
if (!sound)
{
puts("Could not allocate space for the sound data.");
return (EXIT_FAILURE);
}
int amplitude = 10000;
int frequency = 80;
short record = 0;
short waveNumber = 1;
int samplesPerWavelength = SAMPLE_RATE / (frequency/N_CHANNELS);
int soundLen = 10 * samplesPerWavelength;
int ampStep = (int)((amplitude*2)/(int)samplesPerWavelength);
short step = 5*samplesPerWavelength;
short muteRate = amplitude/(soundLen/samplesPerWavelength);
int totalSamplesWritten = 0;
int tempSample =0;
for (i=0, j=0; i<N_SAMPLE_PAIRS*N_CHANNELS; i+=2, j++) {
ampStep = (int)((amplitude*2)/(int)samplesPerWavelength);
tempSample = (int)((totalSamplesWritten%samplesPerWavelength)*ampStep);
sound[i] = tempSample;
sound[i+1] = tempSample;
totalSamplesWritten++;
}
file_name = argc > 1 ? argv[1] : "Default2.wav";
status = WriteWavePCM(sound, N_SAMPLE_PAIRS, file_name);
free(sound);
if (status)
{
printf("Discotheque is ready in \"%s\"\n", file_name);
}
else
{
puts( "Something seems to have gone wrong." );
return (EXIT_FAILURE);
}
return 0;
}
這是我的結果。 有鋸齒但有奇怪的行為。 我不知道為什么會這樣。 我檢查了一系列樣品,一切都很好看。
有人能幫我嗎? 我被困住了,我不知道該怎么做。 我在兩個不同的程序中檢查了它:audiocity和wavepadaudio,然后在這兩個程序中都存在這種行為。 所以我的代碼確實存在問題。 請幫幫我。
當我查看文件轉儲(MSVC編譯)時,我注意到了一些0D 0A
數據對。 然后我改變了這個
fout = fopen( fileName, "w" )
指定二進制文件
fout = fopen( fileName, "wb" )
現在故障已經消失了。
注意
如果未在
mode
給出t
或b
,則默認轉換模式由全局變量_fmode
定義。
因此默認翻譯模式必須是“文本”。
以下是我獲得的輸出的一些屏幕截圖。 對我來說似乎很好。
使用內置規格。 COLLECT_GCC = gcc COLLECT_LTO_WRAPPER = / usr / lib / gcc / i686-pc-cygwin / 5.4.0 / lto-wrapper.exe目標:i686-pc-cygwin配置:/ cygdrive / i / szsz / tmpp / gcc / gcc- 5.4.0-1.i686 / src / gcc-5.4.0 / configure --srcdir = / cygdrive / i / szsz / tmpp / gcc / gcc-5.4.0-1.i686 / src / gcc-5.4.0 - -prefix = / usr --exec-prefix = / usr --localstatedir = / var --sysconfdir = / etc --docdir = / usr / share / doc / gcc --htmldir = / usr / share / doc / gcc / h tml -C --build = i686-pc-cygwin --host = i686-pc-cygwin --target = i686-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir = / usr / lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable -__ cxa_ate xit --with-dwarf2 --with -arch = i686 --with-tune = generic --disable-sjlj-exceptions --enable-languages = ada,c,c ++,fortran,java,lto,objc,obj-c ++ --enable-graphite --enable- threads = posix --enable-libatomic --enable-libcilkrts --enable-libgomp --enable-libitm --enable-libquadmath --enab le-libquadmath-support --enable-libssp --enabl e-libada --enable-libjava --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with- ecj-jar = / usr / share / java / ecj.jar --with-gnu -ld --with-gnu-as --with-cloog-include = / usr / include / cloog-isl --without-libiconv-prefix --without- libintl-prefix --with-system-zlib --enable- linker-build-id --with-default-libstdcxx-abi = gcc4-compatible線程模型:posix gcc版本5.4.0(GCC)
uname -a CYGWIN_NT-6.1-WOW DE-E03895 2.8.0(0.309 / 5/3)2017-04-01 20:42 i686 Cygwin
這是輸出中損壞樣本的屏幕截圖;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.