PDA

View Full Version : سوال: تبدیل سیگنال به یکسری اعداد



group45
سه شنبه 28 اردیبهشت 1389, 22:58 عصر
با سلام
آیا در سی شارپ این قابلیت هست که یه سیگنالو بش بدیم و بعد اون سیگنال رو به یکسری اعداد تبدیل کنه؟؟؟؟؟؟؟؟ مثل matlab


با تشکرات عدیده.........

cardano7
چهارشنبه 29 اردیبهشت 1389, 08:02 صبح
سیگنال خودش آرایه ای از عدده. میشه منظورتون رو از سیگنال مشخص تر بگید؟

group45
چهارشنبه 29 اردیبهشت 1389, 23:12 عصر
ممنون از شما
میخوام یه صدایی رو ضبط کنم بعد از بین چند تا صدا اونو تشخیص بده

cardano7
چهارشنبه 29 اردیبهشت 1389, 23:28 عصر
ممنون از شما
میخوام یه صدایی رو ضبط کنم بعد از بین چند تا صدا اونو تشخیص بده

منظورم اینه که سیگنال را به چه صورتی در اختیار دارید؟
اصلا برنامه هنوز صدا را Import کرده یا نه؟

group45
پنج شنبه 30 اردیبهشت 1389, 11:44 صبح
سلام
نه چطور میشه hmport کرد؟؟؟؟؟؟؟
من میخواستم از متلب عددا رو بگیرم بعد روشون مقیسه رو انجام بدم
ولی اگر میشه با سی شارپ سیگنال رو گرفت و تبدیل به اعداد کرد خوشحال میشم راهنماییم کنید
چون این جوریشو تا حالا کار نکردم

ممنون

cardano7
پنج شنبه 30 اردیبهشت 1389, 16:20 عصر
سلام
بیچاره شدم. آخرش هم اون جوری که می خواستم نشد. این گوگل هم فقط آشغال بالا میاره!
یک برنامه ی دست و پا شکسته فعلا نوشتم.
شما فقط این کار رو بکن:
Play
Stop
Stream
این سه تا دکمه را پشت سر هم بزن. به Open هم کاری نداشته باش. کار نمی کنه.
بعد از زدن Stream حداکثر یک دقیقه باید صبر کنی.
بعد Sream فایل برات نمایش داده میشه.
تحقیق کردم و دیدم انگار Stream فایل Wav خود همون بایت های نوشته شده در اون هست. شما یک بار این کار را با C#‎‎ انجام یده. یک بار هم فایل Modern.wav را با متلب باز کن. من ویندوزم جدید هست و متلبم هم قدیمی برای همین نمی تونم اون را اجرا کنم. شما ببین هر دو یک جواب را بهت میدند یا نه.
این تازه فقط مال wav بود. در مورد mp3 که دیگه نمی دونم چه عزایی باید بگیریم!
خدا پدر اونی را که متلب رو ساخته خیر بده!

cardano7
پنج شنبه 30 اردیبهشت 1389, 16:39 عصر
این رو هم ببین:
http://www.barnamenevis.org/forum/showpost.php?p=953986&postcount=6
شاید به دردت بخوره.
ولی من بلد نیستم چطور میشه استریم یک mp3 را بیرون کشید.

group45
پنج شنبه 30 اردیبهشت 1389, 20:17 عصر
با سلام و تشکر از زحمتی که کشیدید

یه چیزایی رو تو این برنامه متوجه نمیشم:
1-از چه یوزینگی واسه sound player استفاده کردید؟
2-چرا صدای شروع ویندوز رو فقط ضبط میکنه؟(چطور میشه تغییرش داد به صدای میکروفن)؟
یا لاعقل هدایتش کرد به صدای ضبط شده
3-
sp.Stream = Properties.Resources.Modern; کارش چیه؟(مخصوصا طرف راست تساوی!)
4-
sp.Stream.Seek(0, System.IO.SeekOrigin.Begin); کارش چیه؟
5-
char[] myStrChars = new char[buffer.Length * 10]; چرا 10 برابر شده؟
6-
Application.DoEvents(); این یعنی چه؟؟؟؟؟


ببخشید اگه زیادی پرسیدم چون اگه متوجه یه خط کد نشم دیگه چیزی نمی فهمم

با تشکرات عدیده............................

cardano7
پنج شنبه 30 اردیبهشت 1389, 21:41 عصر
اتفاقا سوالات خوبی پرسیدید.
راستش خودم هم به جواب برخی از این سوال ها وقتی پی بردم که برنامه را شروع کردم به نوشتن.


1-از چه یوزینگی واسه sound player استفاده کردید؟
از:

using System.Media;
لازم نیست که یک Reference به برنامه اضافه بشه. همین خط کافیه.


-چرا صدای شروع ویندوز رو فقط ضبط میکنه؟(چطور میشه تغییرش داد به صدای میکروفن)؟
یا لاعقل هدایتش کرد به صدای ضبط شده
3-
sp.Stream = Properties.Resources.Modern; کارش چیه؟(مخصوصا طرف راست تساوی!)
راستش صدایی که گذاشته بودم صدای شروع ویندوز نبود. ولی چون حجم فایل Upload شده محدودیت داره اون را با یک فایل دیگه عوض کردم.(از اسمش مشخصه) :D
اگه خواستی جای فایل صوتی را بدونی اون را می تونی در شاخه ی Resources پیدا کنی.
مشکل اساسی و مایوس کننده ی من همین جاست!
کلا احساس می کنم مایکروسافت دوست داره که همیشه ظاهر همه چیز رو قشنگ کنه. دیگه کاری به وجدان کاری نداره. مثلا اگه یک کنترل بده دستت فقط می تونی کلیاتش رو کنترل کنی. حالا اگه کارت به جزییاتش افتاد بیچاره میشی. فقط ظاهر کنترل خیلی شیک و با کلاسه.
خداییش برو داخل همون کنترل ببین چند تا تابع در اختیارت قرار داده؟ خلاصه ی کلام، Stop و Play
کلی پیگیرش شدم که شاید تنها امیدمون به همین Stream ش باشه.
مسئله اینه که در یک سری از سایت ها چنین عبارتی را می دیدم:

SoundPlayer.Stream = Properties.Resources.Windows_Start
هیچ توضیحی هم نداده بودند که همون عبارت سمت راست چه معنی داره. تا آخر فهمیدم که Windows_Start باید یکی از Resource های برنامه ت باشه. یعنی بری داخل Resource و بعد نوع آیتم ها رو از نوع صوتی انتخاب کنی و بعد یک فایل(از نوع wav) را با این عنوان به برنامه اضافه کنی.
مشکل من هم همین جاست. دوست داشته بودم که مثل Image.FromFile میشد این کار رو به شکل RunTime انجام داد. البته در اینجا هم میشه. اما مشکل اینجاست که Stream رو دیگه در اختیار نداریم. یا لااقل من بلد نیستم. اگه راهش رو پیدا کردید به من هم خبر بدید.


4-
sp.Stream.Seek(0, System.IO.SeekOrigin.Begin); کارش چیه؟
اولش برنامه این خط رو نداشت و stream رو نمی خوند. بعد از یکم بررسی فهمیدم که خود Play میاد و فایل رو تا آخر می خونه. برای همین هم Stream به خط آخر رسیده و باید با این دستور اون را به اول خط برگردوند.


5-
char[] myStrChars = new char[buffer.Length * 10]; چرا 10 برابر شده؟
ممکنه تعجب کنی که چرا به جای اینکه یکی یکی کاراکتر ها را به یک string اضافه کنم اومدم همه رو در یک آرایه از کاراکترها ریختم و بعد آرایه را به رشته تبدیل کردم؟
خوب اولش هم همین کار را کرده بودم. یعنی کاراکترها یکی یکی به string اضافه میشدند. کدهایی شبیه به این:

if (b != -1)
textBox1.Text+=b;
,
textBox1.Text+=", ";


اما دیدم برنامه فجیع هنگ می کرد.
اون عبارتی هم که درصد پروسه رو نشون میداد رو همین جا بود که به برنامه اضافه کردم که ببینم چه خبره.
1% اول رو در 12 ثانیه می رفت.
بعد هر یک درصد که جلو میرفت کندتر و کندتر میشد. طوری که در عرض شاید 5 دقیقه به %7 می رسید.
برنامه را گهگاه Pause می کردم. می دیدم دقیقا سر همین دو خط که مربوط به افزودن به رشته هست متوقف میشه. یعنی برنامه سر این خطوط داره وقت تلف می کنه. تازه فهمیدم که درسته که کلاس string خیلی با حاله ولی خیلی هم کنده و کند بودنش در جملات طولانی مثل اینجا مشخص میشه. در برخی زبانها ترجیح داده میشه که از آرایه ای از کاراکترها به جای یک کلاس استفاده بشه. شاید دلیلش همین سرعتش باشه. زمانی که یک string جا کم میاره و فضای اضافی طلب می کنه، باید دوباره تولید بشه. خودت حسابش را بکن چه بلایی سر حافظه میاره. آخرش مجبور شدم که رشته را در درون یک آرایه از کاراکترها قرار بدم و بعد با

new string(myStrChars)
اون را به رشته تبدیل کنم.
پرسیدید چرا طول اون را برابر buffer.Length * 10 قرار دادم. خوب باید یک مقداری قرار داد که مطمئن باشیم عبارت از اون حد سرریز نمی کنه. هر عدد حداکثر سه رقمه و دو کاراکتر هم برای نشانه گذاری به کار میره. یعنی 5 کاراکتر. من دیگه دست و دل باز بودم 10 تا گرفتم.


6-
Application.DoEvents(); این یعنی چه؟؟؟؟؟
خوب زمانی که داری یک پروسه ی سنگین را انجام میدی کنترل برنامه داخل یک لوپ قرار داره و بنابراین برنامه وقت آزاد برای اجرای Event ها پیدا نمی کنه. برای همین ویندوز برای برنامه ی ما No Respond میده. در حقیقت هر از گاه صدا زدن دستور

Application.DoEvents();
مثل تپاندن قلب رویدادهای برنامه ی ماست. تا برنامه از حالت گرفتگی و جمود در بیاد. مثلا بشه روی پنجره ی اون کلیک کرد یا اون را Maximize ، Minimize و یا Resize کرد. خلاصه برنامه زیر فشار سنگین هم باید عکس العمل های حیاتی از خودش نشون بده.
البته باید توجه داشت که بعضی ها توی هر لوپ حلقه این دستور را صدا می زنند. که این کار باعث کند شدن برنامه میشه. به هر حا اجرای این تابع هم زمان می بره. بهتره که هر چند حلقه یک بار صدا زده بشه.

آدم گاهی تو برنامه نویسی اذیت میشه اما یک چیزایی یاد میگیره که ارزشش رو داره.
مثلا تا دیروز نمی دونستم که string ها این قدر کند هستند.
اگه راهش رو تونستی تا آخر بری من رو بی خبر نگذار.

group45
جمعه 31 اردیبهشت 1389, 11:39 صبح
با سلام و تشکرات ویژه از شما

توضیحات شما واقعا کارگشا بود


if (b != -1)
textBox1.Text+=b;
,
textBox1.Text+=", ";


شما همین کد رو استفاده کن ولی بجای تکست باکس از ریچ تکست باکس استفاده کن ببین تغییری میکنه چون یه جایی خوندم سرعت ریچ نسبت به تکست تو مقادیر زیاد بیشتره.
فعلا دارم روشون کار میکنم به چیزی رسیدم حتما خبرتون می کنم

group45
جمعه 31 اردیبهشت 1389, 12:03 عصر
یه نگاه به این بنداز

http://www.codeproject.com/KB/audio-video/cswavrec.aspx

cardano7
جمعه 31 اردیبهشت 1389, 12:44 عصر
if (b != -1)
textBox1.Text+=b;
,
textBox1.Text+=", ";


شما همین کد رو استفاده کن ولی بجای تکست باکس از ریچ تکست باکس استفاده کن ببین تغییری میکنه چون یه جایی خوندم سرعت ریچ نسبت به تکست تو مقادیر زیاد بیشتره.
فعلا دارم روشون کار میکنم به چیزی رسیدم حتما خبرتون می کنم

دو مرحله وقفه در برنامه ایجاد میشه. یکی برای ایجاد رشته(که ربطی به TextBox) نداره و در هر حال وجود داره. و تنها راهش اینه که به جای string از آرایه ای از کاراکترها استفاده کرد. همون موردی بود که گفتم اذیت می کرد. مورد دوم render شدن گرافیکی رشته درون TextBox هست که احتمالا منظور شما همین مورد هست. در این مورد شاید این طور بشه. :متفکر:

group45
دوشنبه 03 خرداد 1389, 01:14 صبح
با سلام من از این کدا استفاده کردم ولی طبق گفته شما خیلی کنده (به هرحال)
بعضی از اعدادش با اعداد شما فرق می کنه(البته 1000 تای اولشو حساب کردم)
میدونید چرا این طوری شده؟؟؟؟؟؟؟



FileStream fs = new FileStream(@"c:\modern.wav", FileMode.Open,FileAccess.Read);
public string s = null;
public byte[] bt;
private void Form1_Load(object sender, EventArgs e)
{
button2.Enabled = false;
//BinaryReader br = new BinaryReader(fs);
StreamReader sr = new StreamReader(fs);
fs.Position = 0;
for(int i=0;i<1000;i++)
{
richTextBox1.Text += sr.Read();
richTextBox1.Text += " , ";
Application.DoEvents();
}

}


اینم از اعداد تولید شده: