दिलचस्प पोस्ट
Windows में: आप किसी अन्य उपयोगकर्ता संदर्भ के तहत प्रशासक मोड में एक प्रक्रिया कैसे लॉन्च कर सकते हैं? "Java.lang.OutOfMemoryError: जावा हीप स्पेस" त्रुटि (64 एमबी हेप आकार) से कैसे निपटें एक्लेप्से में जावा: मैं फाइल सिस्टम पर कहां रखता हूं जिसे मैं getResource का उपयोग कर लोड करना चाहता हूं? (उदाहरण के लिए एक छवि आइकन के लिए चित्र) कॉन्स्टेंट जावा से एक एनोटेशन के लिए मूल्य कैसे आपूर्ति करें बेस 64 के लिए बाइनरी (डेल्फी) सीवीएस के साथ जीआईटी का उपयोग करने के लिए सर्वोत्तम अभ्यास Log4j में वर्तमान दिनांक को शामिल करने के लिए लॉग फ़ाइल नाम सेट करना Regex & PHP – आईएमजी टैग से src विशेषता को अलग करें कार्यों में PHP वैश्विक Xcode 4.4 रिलीज नोट्स में उल्लेखित "उद्देश्य-सी लिटरल्स" का विवरण क्या है? क्या उद्देश्य-सी और कोको के लेखन के दौरान उपयोग किए जाने वाले सर्वोत्तम प्रथाएं हैं? कच्चे फ़ोल्डर url पथ? मापदंडों के साथ एक बनाते समय डिफ़ॉल्ट पैरामीटरलेस निर्माता क्यों दूर जाते हैं सूचना ट्रैकिंग जैसे फेसबुक (डीबी डिजाइन) जेड 3 में सॉफ्ट / हार्ड बाधाएं

सीन या वर्ग लहर को सी # में बनाना

मैं किसी दिए गए आवृत्ति की एक ऑडियो साइन या वर्ग तरंग कैसे उत्पन्न करूं?

मैं उपकरणों की जांच करने के लिए ऐसा करने की उम्मीद कर रहा हूं, तो ये लहरें कितनी सटीक होंगी?

वेब के समाधान से एकत्रित समाधान "सीन या वर्ग लहर को सी # में बनाना"

आप NAudio का उपयोग कर सकते हैं और एक व्युत्पन्न WaveStream बना सकते हैं जो साइन या स्क्वेयर तरंगों को आउटपुट करती है जो आप साउंड कार्ड पर आउटपुट कर सकते हैं या WAV फ़ाइल में लिख सकते हैं। यदि आप 32-बिट फ़्लोटिंग पॉइंट नमूने का इस्तेमाल करते हैं तो आप मान को सीधे पाप फ़ंक्शन के बाहर लिख सकते हैं, क्योंकि यह 1 और 1 के बीच पहले से चला जाता है।

सटीकता के लिए, क्या आप वास्तव में सही आवृत्ति, या बिल्कुल सही लहर आकार मतलब है? सच वर्ग लहर के रूप में ऐसी कोई चीज नहीं है, और यहां तक ​​कि साइन लहर भी अन्य आवृत्तियों में कुछ बहुत ही शांत कलाकृतियों की संभावना होगी। यदि यह आवृत्ति की सटीकता है, तो आप अपने ध्वनि कार्ड में घड़ी की स्थिरता और सटीकता पर निर्भर हैं। यह कहने के बाद, मैं सोचता हूं कि अधिकतर उपयोगों के लिए सटीकता पर्याप्त होगी

यहां कुछ उदाहरण कोड दिया गया है जो एक 8 kHz नमूना दर पर 1 kHz नमूना बना देता है और 16 बिट नमूने (जो, फ़्लोटिंग बिंदु नहीं है) के साथ:

int sampleRate = 8000; short[] buffer = new short[8000]; double amplitude = 0.25 * short.MaxValue; double frequency = 1000; for (int n = 0; n < buffer.Length; n++) { buffer[n] = (short)(amplitude * Math.Sin((2 * Math.PI * n * frequency) / sampleRate)); } 

यह आपको आवृत्ति, अवधि और आयाम प्रदान करने देता है, और यह 100% .NET CLR कोड है। कोई बाहरी डीएलएल नहीं है यह एक WAV- स्वरूपित MemoryStream बनाकर काम करता है जो कि फ़ाइल को डिस्क पर संग्रहीत किए बिना केवल मेमोरी में एक फ़ाइल बनाने की तरह है तब यह खेलता है कि MemoryStream साथ System.Media.SoundPlayerSystem.Media.SoundPlayer

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) { var mStrm = new MemoryStream(); BinaryWriter writer = new BinaryWriter(mStrm); const double TAU = 2 * Math.PI; int formatChunkSize = 16; int headerSize = 8; short formatType = 1; short tracks = 1; int samplesPerSecond = 44100; short bitsPerSample = 16; short frameSize = (short)(tracks * ((bitsPerSample + 7) / 8)); int bytesPerSecond = samplesPerSecond * frameSize; int waveSize = 4; int samples = (int)((decimal)samplesPerSecond * msDuration / 1000); int dataChunkSize = samples * frameSize; int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize; // var encoding = new System.Text.UTF8Encoding(); writer.Write(0x46464952); // = encoding.GetBytes("RIFF") writer.Write(fileSize); writer.Write(0x45564157); // = encoding.GetBytes("WAVE") writer.Write(0x20746D66); // = encoding.GetBytes("fmt ") writer.Write(formatChunkSize); writer.Write(formatType); writer.Write(tracks); writer.Write(samplesPerSecond); writer.Write(bytesPerSecond); writer.Write(frameSize); writer.Write(bitsPerSample); writer.Write(0x61746164); // = encoding.GetBytes("data") writer.Write(dataChunkSize); { double theta = frequency * TAU / (double)samplesPerSecond; // 'volume' is UInt16 with range 0 thru Uint16.MaxValue ( = 65 535) // we need 'amp' to have the range of 0 thru Int16.MaxValue ( = 32 767) double amp = volume >> 2; // so we simply set amp = volume / 2 for (int step = 0; step < samples; step++) { short s = (short)(amp * Math.Sin(theta * (double)step)); writer.Write(s); } } mStrm.Seek(0, SeekOrigin.Begin); new System.Media.SoundPlayer(mStrm).Play(); writer.Close(); mStrm.Close(); } // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383) 

साइन बनाने और सी # में लहर फ़ाइल को बचाने की कोशिश करें

 private void TestSine() { IntPtr format; byte[] data; GetSineWave(1000, 100, 44100, -1, out format, out data); WaveWriter ww = new WaveWriter(File.Create(@"d:\work\sine.wav"), AudioCompressionManager.FormatBytes(format)); ww.WriteData(data); ww.Close(); } private void GetSineWave(double freq, int durationMs, int sampleRate, short decibel, out IntPtr format, out byte[] data) { short max = dB2Short(decibel);//short.MaxValue double fs = sampleRate; // sample freq int len = sampleRate * durationMs / 1000; short[] data16Bit = new short[len]; for (int i = 0; i < len; i++) { double t = (double)i / fs; // current time data16Bit[i] = (short)(Math.Sin(2 * Math.PI * t * freq) * max); } IntPtr format1 = AudioCompressionManager.GetPcmFormat(1, 16, (int)fs); byte[] data1 = new byte[data16Bit.Length * 2]; Buffer.BlockCopy(data16Bit, 0, data1, 0, data1.Length); format = format1; data = data1; } private static short dB2Short(double dB) { double times = Math.Pow(10, dB / 10); return (short)(short.MaxValue * times); }