private void ProcessorFrequencySkew(SpectrumStage stage, Strengths strengths) { var scaler = stage.FrequencySkewTransformed; var pinToTop = stage.PinToHighFrequency; var magnitude = fftSignal.Select(x => x.Abs).ToArray(); for (int i = strengths.FMin; i <= strengths.FMax; i++) { double k; if (pinToTop) { k = strengths.FMax - (strengths.FMax - i) * scaler; if (k < strengths.FMin) { k = strengths.FMin; } } else { k = (i - strengths.FMin) * scaler + strengths.FMin; if (k > strengths.FMax) { k = strengths.FMax; } } var interpolated = AudioLib.Interpolate.Spline(k, magnitude, false); fftSignal[i].Abs = interpolated; } }
private void ProcessApply(SpectrumStage stage, Strengths strengths, Dictionary <ImpulseConfig, Complex[]> stageOutputs) { if (stage.SelectedApplySource == null) { return; } if (stageOutputs == null) { return; } var idx = stage.SelectedApplySource.Index; if (idx < 0 || idx >= config.Index) // can only apply things with lower index, because otherwise they haven't been computed yet! { return; } var applyFftSignal = stageOutputs.SingleOrDefault(x => x.Key.Index == idx); if (applyFftSignal.Value == null) { return; // Probably should never happen! } for (int i = 1; i < fftSignal.Length / 2; i++) { var stren = strengths.Strength[i]; fftSignal[i] *= (1 - (Complex)stren) + ((Complex)stren * applyFftSignal.Value[i]); fftSignal[fftSignal.Length - i] *= (1 - (Complex)stren) + ((Complex)stren * applyFftSignal.Value[fftSignal.Length - i]); } }
public async Task <IActionResult> Edit(int id, [Bind("Id,Name")] Strengths strengths) { if (id != strengths.Id) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(strengths); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!StrengthsExists(strengths.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(strengths)); }
private void ProcessGain(SpectrumStage stage, Strengths strengths) { for (int i = strengths.FMin; i <= strengths.FMax; i++) { var amount = AudioLib.Utils.DB2gain(stage.GainTransformed * strengths.Strength[i]); fftSignal[i] *= (Complex)amount; fftSignal[fftSignal.Length - i] *= (Complex)amount; } }
private void ProcessMinimumPhase(SpectrumStage stage, Strengths strengths) { // https://dsp.stackexchange.com/questions/7872/derive-minimum-phase-from-magnitude // https://ccrma.stanford.edu/~jos/sasp/Minimum_Phase_Filter_Design.html // https://uk.mathworks.com/matlabcentral/newsreader/view_thread/17748 // https://stackoverflow.com/questions/11942855/matlab-hilbert-transform-in-c /* Matlab example that achieves what we want: * t=-15:0.25:15; * x = pi*t+j*1e-9; * h = real(sin(x)./x); % simple linear phase FIR * H = fft(h,128); * reaLogH = log(abs(H)); * hilb = hilbert(reaLogH); * H2 = exp(hilb); * hMinPhase = real(fliplr(ifft(H2))); * hMinPhase = hMinPhase(1:length(h)); * * figure(1) * plot(t,h,t,hMinPhase) * xlabel('time') * ylabel('Amplitude') */ // hilbert function is the only problematic one, but I've translated that over to C# // This is still pretty much numbers voodoo to me, could someone in the f*****g field write up a pragmatic description // of just what the f**k the hilbert transform does without using pages and pages of obscure math? // f**k I hate academics... if (!stage.MinimumPhase) { return; } var H = fftSignal; var reaLogH = new double[H.Length]; for (int i = 0; i < fftSignal.Length; i++) { reaLogH[i] = Math.Log(H[i].Abs); } var hilb = Hilbert(reaLogH); var H2 = hilb // translate over to System.Numerics as I don't have a Complex.Exp(Complex) function in my library... fail on me .Select(x => new System.Numerics.Complex(x.Real, x.Imag)) .Select(x => System.Numerics.Complex.Exp(x)) .Select(x => new Complex(x.Real, x.Imaginary)) .ToArray(); for (int i = 0; i < fftSignal.Length; i++) { fftSignal[i] = H2[i]; } }
public async Task <IActionResult> Create([Bind("Id,Name")] Strengths strengths) { if (ModelState.IsValid) { _context.Add(strengths); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(strengths)); }
private void ProcessDelay(SpectrumStage stage, Strengths strengths) { var delaySamples = stage.DelayMillisTransformed / 1000.0 * samplerate; for (int i = strengths.FMin; i <= strengths.FMax; i++) { var amount = delaySamples / (double)ImpulseConfig.MaxSampleLength; amount = amount * strengths.Strength[i]; var newVal = fftSignal[i] * Complex.CExp(-2 * Math.PI * i * amount); fftSignal[i] = newVal; fftSignal[fftSignal.Length - i].Arg = -newVal.Arg; } }
private void ProcessRandomGain(SpectrumStage stage, Strengths strengths) { var rand = new Random(stage.RandomGainSeedTransformed); for (int i = 0; i < stage.RandomGainShiftTransformed; i++) { rand.NextDouble(); // pop off x number of samples, "shifting" the sequence forward } var filterCount = stage.RandomGainFilteringTransformed; var gainAmount = stage.RandomGainAmountTransformed; var randCount = strengths.Strength.Length + 2 * filterCount; var mode = stage.RandomGainModeTransformed; var skew = stage.RandomSkewAmountTransformed; var noise = Enumerable.Range(0, randCount).Select(x => rand.NextDouble() * 2 - 1).ToArray(); var filteredNoise = new double[strengths.Strength.Length]; for (int i = filterCount; i < noise.Length - filterCount; i++) { var sum = 0.0; for (int j = -filterCount; j <= filterCount; j++) { var idx = i + j; sum += noise[idx]; } filteredNoise[i - filterCount] = sum / Math.Sqrt(2 * filterCount + 1); } for (int i = strengths.FMin; i <= strengths.FMax; i++) { var skewedNoise = Math.Pow(Math.Abs(filteredNoise[i]), skew) * Math.Sign(filteredNoise[i]); var gf = gainAmount * skewedNoise; var dbGain = gf * strengths.Strength[i]; var scaler = AudioLib.Utils.DB2gain(dbGain); if (mode == ApplyMode.Amplify && scaler < 1) { scaler = 1; } if (mode == ApplyMode.Reduce && scaler > 1) { scaler = 1; } fftSignal[i] *= (Complex)scaler; fftSignal[fftSignal.Length - i] *= (Complex)scaler; } }
public async Task LoadStrengths() { if (Weaknesses.Count == 0) { await LoadWeaknesses(); } IEnumerable <PokeType> pokeTypes = await DataStore.GetItemsAsync(); IEnumerable <PokeType> strengths = pokeTypes.Where(x => x.WeaknessNaturalIDs.Contains(NaturalID)); Strengths.Clear(); foreach (PokeType pokeType in strengths) { Strengths.Add(pokeType); } }
private void ProcessPhaseBands(SpectrumStage stage, Strengths strengths) { var bands = stage.PhaseBandsTransformed; var shift = stage.PhaseBandFreqShiftTransformed; var sections = GetBands(bands, shift, samplerate, fftSignal.Length); var rand = new Random(stage.PhaseBandSeedTransformed); int pb = 0; var delaySamplesMain = stage.PhaseBandDelayMillisTransformed / 1000 * samplerate; foreach (var section in sections) { var delaySamples = rand.NextDouble() * delaySamplesMain; var k = pb / (double)(sections.Count - 1); var amountOfTracking = Math.Abs(stage.PhaseBandFreqTrackTransformed); if (stage.PhaseBandFreqTrackTransformed < 0) { k = 1 - k; var track = k * amountOfTracking + (1 - amountOfTracking); delaySamples *= track; } else { var track = k * amountOfTracking + (1 - amountOfTracking); delaySamples *= track; } var amount = delaySamples / (double)ImpulseConfig.MaxSampleLength; for (int i = section[0]; i <= section[1]; i++) { amount = amount * strengths.Strength[i]; var newVal = fftSignal[i] * Complex.CExp(-2 * Math.PI * i * amount); fftSignal[i] = newVal; fftSignal[fftSignal.Length - i].Arg = -newVal.Arg; } pb++; } }
public void TrimAndUppercaseFirst() { Strengths = Strengths.TrimAndUppercaseFirst(); Weaknesses = Weaknesses.TrimAndUppercaseFirst(); }
public async Task <IActionResult> Import(IFormFile fileExcel) { if (ModelState.IsValid) { if (fileExcel != null) { using (var stream = new FileStream(fileExcel.FileName, FileMode.Create)) { await fileExcel.CopyToAsync(stream); using (XLWorkbook workCoctail = new XLWorkbook(stream, XLEventTracking.Disabled)) { foreach (IXLWorksheet worksheet in workCoctail.Worksheets) { Techniques newtech; var t = (from tech in _context.Techniques where tech.Name.Contains(worksheet.Name) select tech).ToList(); if (t.Count > 0) { newtech = t[0]; } else { newtech = new Techniques(); newtech.Name = worksheet.Name; newtech.Description = "from EXCEL"; _context.Techniques.Add(newtech); } // foreach (IXLRow row in worksheet.RowsUsed().Skip(1)) { try { Coctails coctail = new Coctails(); var coc = (from coct in _context.Coctails where coct.Name.Contains(row.Cell(1).Value.ToString()) select coct).ToList(); if (coc.Count == 0) { coctail.Name = row.Cell(1).Value.ToString(); coctail.YearofCreation = row.Cell(2).Value.ToString(); coctail.CreationHistory = row.Cell(4).Value.ToString(); coctail.Recipe = row.Cell(7).Value.ToString(); coctail.Technique = newtech; if (row.Cell(3).Value.ToString().Length > 0) { var k1 = row.Cell(3).Value.ToString(); Country country; var c = (from ct in _context.Country where ct.Name.Contains(row.Cell(3).Value.ToString()) select ct).ToList(); if (c.Count > 0) { country = c[0]; } else { country = new Country(); country.Name = row.Cell(3).Value.ToString(); _context.Add(country); await _context.SaveChangesAsync();// } coctail.CountryofCreation = country; } if (row.Cell(5).Value.ToString().Length > 0) { Strengths strengths; var k2 = row.Cell(5).Value.ToString(); var s = (from str in _context.Strengths where str.Name.Contains(row.Cell(5).Value.ToString()) select str).ToList(); if (s.Count > 0) { strengths = s[0]; } else { strengths = new Strengths(); strengths.Name = row.Cell(5).Value.ToString(); _context.Add(strengths); await _context.SaveChangesAsync();// } coctail.Strength = strengths; } if (row.Cell(6).Value.ToString().Length > 0) { Glass glass; var k3 = row.Cell(6).Value.ToString(); var g = (from gl in _context.Glass where gl.Name.Contains(row.Cell(6).Value.ToString()) select gl).ToList(); if (g.Count > 0) { glass = g[0]; } else { glass = new Glass(); glass.Name = row.Cell(6).Value.ToString(); _context.Add(glass); await _context.SaveChangesAsync();// } coctail.Glass = glass; } _context.Coctails.Add(coctail); } } catch (Exception e) { } } } } } } await _context.SaveChangesAsync(); } return(RedirectToAction(nameof(Index))); }
private void LoadOnlineStrategy(StorageFile listsSourceFile) { SlideHeaders.Clear(); Websites.Clear(); Strengths.Clear(); Categories.Clear(); ProductSources.Clear(); if (!listsSourceFile.ExistsLocal()) { return; } var document = new XmlDocument(); document.Load(listsSourceFile.LocalPath); var node = document.SelectSingleNode(@"/OnlineStrategy"); if (node == null) { return; } foreach (XmlNode childeNode in node.ChildNodes) { switch (childeNode.Name) { case "Header": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!string.IsNullOrEmpty(attribute.Value) && !SlideHeaders.Contains(attribute.Value)) { SlideHeaders.Add(attribute.Value); } break; } } break; case "Site": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!string.IsNullOrEmpty(attribute.Value) && !Websites.Contains(attribute.Value)) { Websites.Add(attribute.Value); } break; } } break; case "Strength": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!string.IsNullOrEmpty(attribute.Value) && !Strengths.Contains(attribute.Value)) { Strengths.Add(attribute.Value); } break; } } break; case "PricingStrategy": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!string.IsNullOrEmpty(attribute.Value) && !PricingStrategies.Contains(attribute.Value)) { PricingStrategies.Add(attribute.Value); } break; } } break; case "PositionColumn": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!string.IsNullOrEmpty(attribute.Value) && !ColumnPositions.Contains(attribute.Value)) { ColumnPositions.Add(attribute.Value); } break; } } break; case "DefaultFormula": switch (childeNode.InnerText.ToLower().Trim()) { case "cpm": DefaultFormula = FormulaType.CPM; break; case "investment": DefaultFormula = FormulaType.Investment; break; case "impressions": DefaultFormula = FormulaType.Impressions; break; } break; case "LockedMode": { bool temp; if (Boolean.TryParse(childeNode.InnerText, out temp)) { LockedMode = temp; } } break; case "SpecialLinksEnable": { bool temp; if (Boolean.TryParse(childeNode.InnerText, out temp)) { SpecialLinksEnable = temp; } } break; case "SpecialButtonsGroupName": SpecialLinksGroupName = childeNode.InnerText; break; case "SpecialButtonsGroupLogo": if (string.IsNullOrEmpty(childeNode.InnerText)) { SpecialLinksGroupLogo = null; } else { SpecialLinksGroupLogo = new Bitmap(new MemoryStream(Convert.FromBase64String(childeNode.InnerText))); } break; case "Browser": SpecialLinkBrowsers.Add(childeNode.InnerText); break; case "SpecialButton": var specialLinkButton = new SpecialLinkButton(); GetSpecialButton(childeNode, ref specialLinkButton); if (!String.IsNullOrEmpty(specialLinkButton.Name) && !String.IsNullOrEmpty(specialLinkButton.Type) && specialLinkButton.Paths.Any()) { SpecialLinkButtons.Add(specialLinkButton); } break; case "Targeting": { var productInfo = new ProductInfo { Type = ProductInfoType.Targeting }; productInfo.Deserialize(childeNode); TargetingRecods.Add(productInfo); } break; case "RichMedia": { var productInfo = new ProductInfo { Type = ProductInfoType.RichMedia }; productInfo.Deserialize(childeNode); RichMediaRecods.Add(productInfo); } break; case "Category": var category = new Category(); GetCategories(childeNode, ref category); if (!string.IsNullOrEmpty(category.Name)) { Categories.Add(category); } break; case "Product": var productSource = new ProductSource(); GetProductProperties(childeNode, ref productSource); if (!string.IsNullOrEmpty(productSource.Name)) { ProductSources.Add(productSource); } break; case "Status": foreach (XmlAttribute attribute in childeNode.Attributes) { switch (attribute.Name) { case "Value": if (!Statuses.Contains(attribute.Value)) { Statuses.Add(attribute.Value); } break; } } break; case "DefaultHomeViewSettings": DefaultHomeViewSettings.Deserialize(childeNode); break; case "DefaultDigitalProductSettings": DefaultDigitalProductSettings.Deserialize(childeNode); break; case "DefaultDigitalProductPackageSettings": DefaultDigitalProductPackageSettings.Deserialize(childeNode); break; case "DefaultDigitalStandalonePackageSettings": DefaultDigitalStandalonePackageSettings.Deserialize(childeNode); break; case "DigitalControlsConfiguration": DefaultControlsConfiguration = JsonConvert.DeserializeObject <DigitalControlsConfiguration>(Encoding.Unicode.GetString(Convert.FromBase64String(childeNode.InnerText)), new JsonImageConverter()); break; } } }
private void ProcessGainVariation(SpectrumStage stage, Strengths strengths) { var absMaxIndex = fftSignal.Length / 2; var gain = new double[strengths.Strength.Length]; var amt = stage.GainSmoothingAmountTransformed; var octavesToSmooth = stage.GainSmoothingOctavesTransformed; var hzPerPartial = 1 / (double)absMaxIndex * samplerate / 2; var mode = stage.GainSmoothingModeTransformed; for (int i = 1; i <= fftSignal.Length / 2; i++) { var freq = i * hzPerPartial; var lowFreq = freq * Math.Pow(2, -octavesToSmooth); var highFreq = freq * Math.Pow(2, octavesToSmooth); var iBelow = (freq - lowFreq) / hzPerPartial; var iAbove = (highFreq - freq) / hzPerPartial; var avgSum = 0.0; int count = 0; for (int j = -(int)Math.Round(iBelow); j <= Math.Round(iAbove); j++) { var idx = i + j; if (idx <= 0) { continue; } if (idx > absMaxIndex) { continue; } count++; var sample = fftSignal[idx].Abs; avgSum += sample; } avgSum /= count; var avgDb = AudioLib.Utils.Gain2DB(avgSum); var partialDb = AudioLib.Utils.Gain2DB(fftSignal[i].Abs); var diffDb = partialDb - avgDb; var stren = strengths.Strength[i]; var newMagDb = avgDb + diffDb * (amt * stren + 1 * (1 - stren)); var newGain = AudioLib.Utils.DB2gain(newMagDb) / fftSignal[i].Abs; gain[i] = newGain; if (mode == ApplyMode.Amplify && newGain < 1) { gain[i] = 1; } else if (mode == ApplyMode.Reduce && newGain > 1) { gain[i] = 1; } } for (int i = strengths.FMin; i <= strengths.FMax; i++) { var g = gain[i]; fftSignal[i] *= (Complex)g; fftSignal[fftSignal.Length - i] *= (Complex)g; } }