ورود

View Full Version : هدر فایل wav



marziehk
شنبه 09 آبان 1394, 13:05 عصر
با سلام دریک برنامه که من قطعه ای از آن را در اینجا قرار می دهم هدر یک فایل wav خوانده می شود و در متغییرهایی ریخته می شود من می خواستم بدونم متغیر (4) c چه اطلاعاتی را در خود نگهداری می کند آیا حذف آن از قسمت بررسی شرط ها در if مشکلی در برنامه ایجاد می کند. من یک فایل wav با نرخ نمونه برداری 8000 هرتز و 16 بیت برای هر نمونه ایجاد کرده ام ولی بررسی این شرط اجازه استفاده از آن را در برنامه نمی دهد. [ fpi, emsg ] = fopen( [path,file], 'r' ); fHdrOffset = WAVHDRSIZE;
guiIfile = file;

% READ WAVE FILE HEADER
rID = fread( fpi, 4, 'char' );
rLen = fread( fpi, 1, 'long' );
wId = fread( fpi, 4, 'char' );
ChunkID = fread( fpi, 4, 'char' );
fLen = fread( fpi, 1, 'long' );
wFormatTag = fread( fpi, 1, 'short' );
nChannels = fread( fpi, 1, 'short' );
nSamplesPerSec = fread( fpi, 1, 'long' );
nAvgBytesPerSec = fread( fpi, 1, 'long' );
nBlockAlign = fread( fpi, 1, 'short' );
FormatSpecific = fread( fpi, fLen-14, 'char' );
dId = fread( fpi, 4, 'char' );
dLen = fread( fpi, 1, 'long' );

% VERIFY VALID .WAV FILE HAS BEEN SELECTED
WORDSIZE = nBlockAlign;
FSAMP = nSamplesPerSec;
c = zeros( 9, 1 );
c(1) = strcmp( setstr( rID )', 'RIFF' );
c(2) = strcmp( setstr( wId )', 'WAVE' );
c(3) = strcmp( setstr( ChunkID )', 'fmt ' );
c(4) = strcmp( setstr( dId )', 'data' );
c(5) = (wFormatTag == 1);
c(6) = (nChannels == 1);
c(7) = (nAvgBytesPerSec == (FSAMP * WORDSIZE));
c(8) = WORDSIZE == 2;
c(9) = FSAMP == 8000;
if sum(c) ~= length(c)
if ~c(1) || ~c(2) || ~c(3) || ~c(4) || ~c(7)
error( 'Invalid .WAV file: File header corrupted!' );

rahnema1
شنبه 09 آبان 1394, 17:51 عصر
سلام
احتمالا فایلی که دارید استفاده می کنید فشرده شده.
لازمه که از wav فشرده نشده PCM استفاده کنید

Nader G
شنبه 09 آبان 1394, 19:22 عصر
1. اگه wFormatTag برابر 1 باشه یعنی دیتا با فرمت PCM ذخیره شده که در برنامتون داره چک میشه.
2. توی این کد فرض شده بخش data بلافاصله بعد از بخش fmt قرار گرفته که ممکنه درست نباشه و بین اینها بخش های (chunks) دیگه ای هم باشن که کد شما اون ها رو بررسی نمی کنه.
می تونید فایل wav رو با یه برنامه هگز ادیتور یا تکست ادیتور باز کنید ببینید chunk بعد از fmt چی هست.

marziehk
یک شنبه 10 آبان 1394, 00:16 صبح
مرسی از پاسخگویی تون .
من یه فایل با فرمت ogg ضبط کردم و بعد با نرم افزار avs اونو به فرمت wav با نرخ نمونه برداری 8000 هرتز و 16 بیت در هر نمونه به pcm تبدیل کردم. از این صوت می خوام برای یه کد فشرده سازی صوت که تو متلب نوشته شده استفاده کنم و برنامه رو با اون تست کنم. به نظرتون این صوت می تونه پاسخگو باشه یانه؟ من کدو روی این صوت بدون در نظر گرفتن شرط (4)c انجام می دم بهم خروجی میده می خوام بدونم امکان داره خروجی اشتباه باشه و اون چیزی که من می خوام نباشه و صرفا فقط یه خروجی داده باشه یا نه. با تشکر

rahnema1
یک شنبه 10 آبان 1394, 08:56 صبح
این برنامه متلب شما فقط قادر هست فرمت PCM استاندارد ساده را بخونه اما برنامه تبدیل کننده احتمالا فایل ogg را به pcm از نوع extended تبدیل می کنه
برای تبدیل ogg به wav می تونید از برنامه های زیر استفاده کنید:
http://www.rarewares.org/ogg-oggdec.php
http://www.sector-seven.net/software/flicflac
که اولی در خط فرمان cmd اجرا می شه
دومی استفاده ازش راحت تره ولی گزینه های کمتری داره
این دو برنامه بالا خیلی کم حجم هستند و فکر کنم کار شما را راه بیندازند در غیر این صورت
یک برنامه پیشرفته تر به نام Audacity هم وجود داره
هر سه تا رایگان و اپن سورس هستند

Nader G
یک شنبه 10 آبان 1394, 12:18 عصر
با اضافه کردن چند خط به کدتون می تونید data chunk رو پیدا کنید و بخونید. یک حلقه می نویسید که id و سایز chunk رو بخونه
و اگه id برابر 'data' نبود با کمک fseek توی فایل جلو میره تا بخش بعدی رو بخونه.

نمی تونید از audioread (https://www.mathworks.com/help/matlab/ref/audioread.html) یا wavread (https://www.mathworks.com/help/matlab/ref/wavread.html) استفاده کنید؟

marziehk
دوشنبه 11 آبان 1394, 07:36 صبح
تشکر ار پاسخ هاتون نتیجه داد مشکلم حل شد. ببخشبد یه سوال دیگه اگه فریم های یه صوت بعد از عملیات موردنظر به ترتیب توی یه آرایه پشت هم ذخیره بشن و بعد برای پخش صوت از دستور wavplay استفاده شه، اینکه فریم ها پیوستگی ندارند و از توی آرایه دارن خونده می شن رو کیفیت صوت تغییر ایجاد می کنه؟ این تغییر خیلی زیاده؟