কীভাবে একটি সাইন ওয়েভ জেনারেটর তৈরি করবেন যা ফ্রিকোয়েন্সিগুলির মধ্যে সহজেই স্থানান্তর করতে পারে


27

আমি অডিওর জন্য একটি বেসিক সাইন ওয়েভ জেনারেটর লিখতে সক্ষম, তবে আমি চাই এটি সহজেই একটি ফ্রিকোয়েন্সি থেকে অন্য ফ্রিক্যোয়েন্সিতে স্থানান্তর করতে সক্ষম হয়। আমি যদি কেবল একটি ফ্রিকোয়েন্সি উত্পন্ন করা বন্ধ করি এবং তাত্ক্ষণিকভাবে অন্যটিতে স্যুইচ করি তবে সিগন্যালে একটি বিরতি থাকবে এবং একটি "ক্লিক" শোনা যাবে।

আমার প্রশ্নটি হল, 250 কিল্ড হার্জ বলতে শুরু করে এমন একটি তরঙ্গ উত্পন্ন করার জন্য একটি ভাল অ্যালগরিদম কী এবং তারপরে কোনও ক্লিক না পরিচয় করে 300Hz এ স্থানান্তরিত করুন। যদি অ্যালগরিদমে কোনও optionচ্ছিক গ্লাইড / পোর্টামেন্টো সময় অন্তর্ভুক্ত থাকে তবে আরও ভাল।

আমি কয়েকটি সম্ভাব্য পদ্ধতির কথা ভাবতে পারি যেমন লো পাস ফিল্টার অনুসরণ করে ওভারস্যাম্পলিং, বা হতে পারে একটি ওয়েভটেবল ব্যবহার করা, তবে আমি নিশ্চিত যে এটির একটি সাধারণ পর্যায়ে সমস্যা এটির মোকাবেলার একটি আদর্শ উপায় আছে।


2
কেন আপনি কেবল স্থানান্তরের সময়কালে লিনিয়ার ফ্রিকোয়েন্সি রূপান্তর ব্যবহার করেন নি। উদাহরণস্বরূপ, আপনাকে টি ২০ তে টাইম ফ্রিকোয়েন্সি এফ 0 থেকে টাইম ফ্রিকোয়েন্সি এফ 1 এ ট্রান্সজিট করতে হবে, তবে কেন কেবল ট্রানজিশন ফ্রিকোয়েন্সি f (t) = f0 * (1-q) + f1 * q প্রবর্তন করবেন না, যেখানে q = (t) -t0) / (t1-t0), তারপরে A (t) = sin (2 * পাই * f (t) * t) সিগন্যাল তৈরি করুন?
mbaitoff

উত্তর:


24

আমি অতীতে যে পদ্ধতির ব্যবহার করেছি তা হ'ল একটি পর্যায় সঞ্চালক বজায় রাখা যা একটি তরঙ্গরূপ অনুসন্ধানের টেবিলের সূচক হিসাবে ব্যবহৃত হয়। প্রতিটি নমুনার ব্যবধানে সঞ্চয়ের সাথে একটি ফেজ ডেল্টা মান যুক্ত করা হয়:

phase_index += phase_delta

ফ্রিকোয়েন্সি পরিবর্তন করতে আপনি প্রতিটি নমুনায় ফেজ সঞ্চয়ের সাথে যুক্ত হওয়া ফেজ ডেল্টা পরিবর্তন করেন change

phase_delta = N * f / Fs

কোথায়:

phase_delta is the number of LUT samples to increment
freq is the desired output frequency
Fs is the sample rate

এটি গ্যারান্টি দেয় যে আউটপুট তরঙ্গরূপ অবিচ্ছিন্ন থাকলেও আপনি গতিবেগের সাথে পর্যায়_ডেল্টা পরিবর্তন করেন, যেমন ফ্রিকোয়েন্সি পরিবর্তন, এফএম ইত্যাদি etc.

ফ্রিকোয়েন্সি (পোর্টামেন্টো) -এর মসৃণ পরিবর্তনের জন্য আপনি কেবলমাত্র তাত্ক্ষণিকভাবে পরিবর্তনের পরিবর্তে পর্যাপ্ত নমুনার ব্যবধানে তার পুরানো মান এবং নতুন মানের মধ্যে ফেজ_ডেল্টা মানটিকে র‌্যাম্প করতে পারেন।

নোট করুন phase_indexএবং phase_deltaউভয়ের একটি পূর্ণসংখ্যা এবং একটি ভগ্নাংশ উপাদান রয়েছে, অর্থাত্ তাদের ভাসমান বিন্দু বা স্থির বিন্দু হওয়া দরকার। ফেজ_ইন্ডেক্স (মডুলো টেবিল আকার) এর পূর্ণসংখ্যার অংশটি ওয়েভফর্ম এলটিউটে সূচক হিসাবে ব্যবহৃত হয় এবং ভগ্নাংশ অংশটি উচ্চতর মানের আউটপুট এবং / অথবা আরও ছোট লুট আকারের সংলগ্ন LUT মানগুলির মধ্যে সংযোগের জন্য বিকল্পভাবে ব্যবহৃত হতে পারে।


ধন্যবাদ, আমি প্রত্যাশা করছিলাম যে উত্তরটিতে LUTs জড়িত থাকতে পারে। আমি একটি এলইউটি দিয়ে যাবার কথা ভাবছিলাম যাতে 1Hz (যেমন Fs এন্ট্রি) এর একটি তরঙ্গরূপ রয়েছে। LUT এর সর্বোত্তম আকার পরিচালনা করার জন্য কি কোনও নিয়ম রয়েছে?

4
এটি বিভিন্ন কারণের উপর নির্ভর করে: আপনি কী এসএনআর সন্ধান করছেন, এটি খাঁটি সাইন ওয়েভ বা আরও জটিল তরঙ্গরূপ, আপনি সংলগ্ন এলটিউটের প্রবেশদ্বারগুলি বা কেবল ছাঁটাই করা ইত্যাদির মধ্যে বিভাজন করার পরিকল্পনা করছেন কিনা ইত্যাদি এটিও নির্ভর করে যে আপনি কেবল যাচ্ছেন কিনা তার উপরও এটি নির্ভর করে একটি একক চতুষ্কোণ টেবিল আছে এবং সূচী গাণিতিক পরিচালনা করুন এবং নিজেকে বিপরীতে সাইন ইন করুন, বা একটি পূর্ণ চারটি চতুর্ভুজ সারণী রাখুন। ব্যক্তিগতভাবে আমি একটি 1024 পয়েন্ট দিয়ে শুরু করব (এনবি: 2 ^ এন মডুলো ইনডেক্সিংয়ের জন্য ভাল) চারটি চতুর্ভুজ টেবিলটি কোনও বিরতিহীন নয় কারণ এটি খুব সহজ এবং উদাহরণস্বরূপ 16 বিট "গ্রাহক" অডিওর জন্য ভাল ফলাফল দেওয়া উচিত।
পল আর

1
ভাল উত্তর, পল। এই বিষয়টিতেও একই রকম প্রশ্ন রয়েছে যা কিছুক্ষণ আগে পোস্ট করা হয়েছিল; আরও তথ্য সর্বদা সহায়তা করে।
জেসন আর

4
এই পদ্ধতির দিকে তাকানোর আর একটি উপায় হল ভোল্টেজ-নিয়ন্ত্রিত দোলক (ভিসিও) এর একটি অনুকরণ। কোনও ভিসিওর আউটপুট ফ্রিকোয়েন্সি ইনপুট ভোল্টেজের উপর নির্ভর করে (সাধারণত ইনপুট ভোল্টেজের লিনিয়ার ফাংশন) তবে ইনপুট ভোল্টেজ তাত্ক্ষণিকভাবে স্যুইচ হলেও continuous আউটপুটটি হ'ল যেখানে রয়েছে সময়ের একটি অবিচ্ছিন্ন ক্রিয়াকলাপ, যখন আউটপুট ফ্রিকোয়েন্সিটি পর্বের ডেরাইভেটিভ এবং সমান যেখানে ফ্রিকোয়েন্সি। ϕ ( টি ) ω 0 + কে এক্স ( টি ) ω 0
sin(ϕ(t))=sin(0tω0+kx(τ)dτ)
ϕ(t)
ω0+kx(t)
ω0
দিলিপ সরোতে

1
আমারও একই সমস্যা ছিল, সঞ্চয়ের ধারণার জন্য ধন্যবাদ (আমি প্রত্যক্ষ গণনাটি ব্যবহার করছিলাম, যা আনুমানিকের কারণে কার্যকর হয়নি): jsfiddle.net/sebpiq/p3ND5/12
sebpiq

12

সাইন ওয়েভ তৈরির সর্বোত্তম উপায়গুলির মধ্যে একটি হ'ল পুনরাবৃত্তিমূলক আপডেটিংয়ের সাথে জটিল ফাসার ব্যবহার করা। অর্থাত

z[n+1]=z[n]Ω

যেখানে z [n] হ'ল ফ্যাসার, , রেডিয়েন্সে দোলকের কৌণিক ফ্রিকোয়েন্সি এবং নমুনা সূচক। এর আসল এবং কল্পিত উভয় অংশই সাইন ওয়েভ, তারা পর্যায়টির বাইরে 90 ডিগ্রি। আপনার সাইন এবং কোসাইন উভয়ই প্রয়োজন হলে খুব সুবিধাজনক। একটি একক নমুনার গণনায় কেবল 4 টি গুণ এবং 4 টি সংযোজন প্রয়োজন এবং এটি পাপ () কোস () বা লুকিং টেবিলযুক্ত যেকোনো কিছু থেকে সস্তা। সম্ভাব্য সমস্যাটি হ'ল সংখ্যাসম্য নির্ভুলতার সমস্যার কারণে প্রশস্ততা সময়ের সাথে সাথে প্রবাহিত হতে পারে। তবে এটি মেরামত করার জন্য মোটামুটি এগিয়ে রয়েছে। আসুন যাক যে । আমরা জানি যে একতার বিশালতা হওয়া উচিত, অর্থাত্ ω n জেড [ এন ] জেড [ এন ] = + জে বি জেড [ এন ]Ω=exp(jω)ωnz[n]z[n]=a+jbz[n]

aa+bb=1

সুতরাং আমরা যদি একবারের মধ্যে একবারে যাচাই করতে পারি তবে যদি এখনও কেস থাকে এবং সেই অনুযায়ী সঠিক হয়। সঠিক সংশোধন হবে

z[n]=z[n]aa+bb

এটা একটা বিশ্রী হিসাব কিন্তু যেহেতু খুব ঐক্য পাসে আপনি অনুমান করতে পারে হয় কাছাকাছি একটি টেলর প্রসারের পদ এবং আমরা পেতে1 / √ √aa+bb x=11/xx=1

1x3x2

সুতরাং সংশোধন সহজতর হয়

z[n]=z[n]3a2b22

প্রতি কয়েক শতাধিক নমুনা এই সাধারণ সংশোধন প্রয়োগ করলে দোলক চিরকালের জন্য স্থিতিশীল থাকবে।

ক্রমাগত ফ্রিকোয়েন্সি পরিবর্তনের জন্য গুণক ডাব্লু সেই অনুযায়ী আপডেট করা প্রয়োজন। এমনকি গুণকটিতে একটি অবিচ্ছিন্ন পরিবর্তন অবিচ্ছিন্ন দোলক কার্য বজায় রাখবে। যদি ফ্রিকোয়েন্সি র‌্যাম্পিংয়ের প্রয়োজন হয় তবে আপডেটটি কয়েকটি ধাপে বিভক্ত হয়ে যেতে পারে বা আপনি একই গুণককে অ্যালগরিদমটি গুণককে আপডেট করতে পারেন (যেহেতু এটি একটি aক্য লাভ জটিল ফাসারও)।


এই উত্তরের জন্য ধন্যবাদ, কিছু বাস্তব ওয়ার্ল্ড কোড রূপান্তর করতে যথেষ্ট ভাল বুঝতে সম্ভবত আমাকে কিছুটা সময় লাগবে, তবে এটি চেষ্টা করার মতো একটি আকর্ষণীয় বিকল্প বলে মনে হচ্ছে।
হিথ

2
আমি এই সমাধানটি রেফারেন্সের জন্য গোলংয়ে প্রয়োগ করেছি: github.com/rmichela/Acoustico/blob/…
রায়ান

এটি একটি সুন্দর সমাধান যা দুর্ভাগ্যক্রমে, যদি ধ্রুবক সময় বেস ব্যবহার করা হয় তবে কেবল ভাল কাজ করে। যদি তা না হয় তবে সঠিক জটিল ঘূর্ণন গণনা করার জন্য আপনাকে একটি পাপ এবং একটি কোস গণনা করতে হবে।
ক্যামেরন ট্যাকলিন্ড

2

এই সাইট থেকে :

এক ফ্রিকোয়েন্সি থেকে অন্যটি বা একের প্রশস্ততাতে একটি মসৃণ ট্রানজিশন তৈরি করতে, একটি অসম্পূর্ণ সাইন ওয়েভটি একটি সংযুক্ত অংশের সাথে সংশোধন করতে হবে যাতে লুপটির প্রতিটি পুনরাবৃত্তির পরে ফলাফল তরঙ্গটি এক্স-অক্ষে শেষ হয়।

মনে হচ্ছে এটি কাজ করা উচিত।

(প্রকৃতপক্ষে, যদি তারা উভয়ই স্থানান্তরিত হওয়ার পরে এক্স-অক্ষে সিঙ্ক্রোনাইজ হয় তবে আমি মনে করি একটি ধীরে ধীরে রূপান্তর প্রয়োজন নেই))


1
এই বলে, ফ্রিকোয়েন্সি বর্তমান sinusoid জন্য অপেক্ষা সম্পূর্ণ এক চক্র এবং উতরান এবং তারপর ফ্রিকোয়েন্সিতে অন্যান্য sinusoid স্যুইচ । এটি কার্যকরভাবে পর্বের ধারাবাহিকতা বজায় রাখে এবং অডিও অ্যাপ্লিকেশনগুলির জন্য ঠিক আছে সম্ভবত কাঙ্ক্ষিত স্যুইচ সময় (এখন) এবং বাস্তবায়িত সুইচ সময় (যখন আমার সাইনোসয়েড একটি চক্র সম্পূর্ণ করে) এর মধ্যে কয়েকটি মিলিসেকেন্ড বা মাইক্রোসেকেন্ডের বিলম্ব অসঙ্গতিযুক্ত। তবে, পার্থক্যটি অন্যান্য অ্যাপ্লিকেশনগুলিতে সমস্যা দিতে পারে। কেবল মনে রাখবেন যে একটি সাইনোসয়েড এক চক্রের মধ্যে দুবার এবং সঠিকটি বাছাই করতে ভুলবেন না! 0 ω 1 0ω00ω10
দিলীপ সরোতে

2

আমি একটি পর্যায় সঞ্চালক ব্যবহারের পূর্ববর্তী পরামর্শগুলির সাথে একমত। মূলত কন্ট্রোল ইনপুট হ'ল ধাপে প্রতি পদক্ষেপ বা প্রতি ক্লক পিরিয়ডের পরিমাণ (বা প্রতি বিঘ্নিত বা যা কিছু হোক), যাতে সেই মানটি পরিবর্তন করে ফেজটিতে বিরতি ছাড়াই ফ্রিকোয়েন্সি পরিবর্তন করে। তরঙ্গ প্রশস্ততা তারপরে সঞ্চিত পর্বের মান থেকে LUT বা পাপের (থেটা) বা কোস (থেইটা) গণনার মাধ্যমে নির্ধারিত হয়।

এটি মূলত যা সংখ্যাসূচকভাবে নিয়ন্ত্রিত অসিলেটর (এনসিও) বা সরাসরি ডিজিটাল সিন্থেসাইজার (ডিডিএস) হিসাবে পরিচিত as এই পদগুলিতে একটি ওয়েব অনুসন্ধান করা সম্ভবত তাদের তাত্পর্য এবং তত ভালভাবে কাজ করার তত্ত্ব এবং অনুশীলন সম্পর্কে জানতে চেয়ে বেশি ফলন পেতে পারে।

অতিরিক্ত সংযোজক যুক্ত করা ফেজের অগ্রিম মানের পরিবর্তনের হারকে নিয়ন্ত্রণ করে আপনি যেমন পরামর্শ করেছেন তেমন ফ্রিকোয়েন্সিগুলির মধ্যে বিজোড় স্থানান্তরের অনুমতি দিতে পারে। এটিকে কখনও কখনও ডিজিটাল ডিফারেন্সিয়াল অ্যানালাইজার বা ডিডিএ বলা হয়।


ভাল অতিরিক্ত তথ্য। তোমাকে কাছাকাছি দেখে খুশি হলাম, এরিক; আমরা আলগোরিদিম মন্ত্রীর ব্যবহার করতে পারি।
জেসন আর

1

1 ম অর্ডার, আপনার নতুন ফ্রিকোয়েন্সি সাইনোসয়েডের প্রারম্ভিক পর্যায়ে সামঞ্জস্য করা উচিত যাতে এটি 1 ম ট্রানজিশনের নমুনা বিন্দুতে আগের সাইনোসয়েডের পর্বের মতো হয়। প্রথম ফ্রিকোয়েন্সি গণনা করুন এবং দ্বিতীয় ফ্রিকোয়েন্সি জন্য তার পর্বটি ব্যবহার করুন।

২ য় বিকল্পটি হতে পারে ডি_ফেসটি frequencyালু পথ হতে পারে এক ফ্রিকোয়েন্সি থেকে পরের কয়েকটি স্যাম্পল। এটি 1 ম ডেরিভেটিভের ধারাবাহিকতা পরিষ্কার করবে এবং একটি গ্লাইড সরবরাহ করবে।

তৃতীয় বিকল্পটি হতে পারে ডি-ফেজ র‌্যাম্পিং হারে স্মুডিং উইন্ডো, যেমন উত্থিত-কোসাইন হিসাবে ব্যবহার করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.